Комментарии о данном ответе
Вопросы:
- Почему причинные слои изначально наносятся независимо?
- Почему они применяются зависимо после изменения формы?
- Почему бы не применять их с самого начала?
Этот ответ довольно странный. Я не эксперт, но я не вижу необходимости сохранять независимые функции со слоем TimeDistributed
. Но я также не могу сказать, дает ли это лучший результат или нет. Сначала я бы сказал, что это просто ненужно. Но это может принести дополнительный интеллект, учитывая, что он может видеть отношения, которые включают в себя отдаленные шаги между двумя функциями вместо того, чтобы просто смотреть на «одинаковые шаги». (Это должно быть проверено)
Тем не менее, в этом подходе есть ошибка .
Изменения формы, предназначенные для обмена задним числом и размерами элементов, не соответствуют ожидаемым. Автору ответа явно хочется поменять оси (сохраняет интерпретацию того, что является особенностью, что есть просмотр), что отличается от изменить (смешивает все, и данные теряют смысл)
Для правильного подхода потребуется замена оси, например model.add(Permute((2,1)))
вместо изменения формы.
Итак, я не знаю этих ответов, но, кажется, ничто не создает такой потребности.
Одно несомненно: вам наверняка понадобится зависимая часть. Модель не приблизится к интеллекту вашей исходной модели, если она не учитывает отношения между функциями. (Если вам не повезло, что ваши данные полностью независимы)
Теперь объясним связь между LSTM и Conv1D
LSTM
можно напрямую сравнить с Conv1D
, и используемые формы абсолютно одинаковы, и они означают практически то же самое, если вы используете channels_last
.
Тем не менее, форма (samples, input_length, features_or_channels)
является правильной формой для LSTM
и Conv1D
. На самом деле, функции и каналы в этом случае абсолютно одинаковы. Что меняется, так это то, как работает каждый слой относительно длины ввода и расчетов.
Концепция фильтров и ядер
Ядро - это весь тензор внутри слоя конвона, который будет умножен на входные значения для получения результатов. Ядро включает его пространственный размер (kernel_size
) и число filters
(выходные функции). А также фильтры автоматического ввода.
Ядров нет, но есть kernel_size
. Размер ядра - это количество шагов в длине, которые будут объединены для каждого шага вывода. (Этот учебник отлично подходит для непонятных двумерных сверток относительно того, что он делает и каков размер ядра - просто представьте вместо этого 1D-изображения - этот учебник не показывает количество «фильтров», хотя, как 1 -фильтр анимации)
Число filters
напрямую связано с числом features
, это одно и то же.
Какие фильтры и ядро должны быть установлены?
Итак, если ваш слой LSTM
использует units=256
, что означает, что он выведет 256 объектов, вы должны использовать filters=256
, что означает, что ваша свертка выведет 256 каналов / объектов.
Это не правило, хотя , вы можете обнаружить, что использование большего или меньшего количества фильтров может привести к лучшим результатам, поскольку слои в конце концов делают разные вещи. Нет необходимости иметь все слои с одинаковым количеством фильтров! Здесь вы должны пойти с настройкой параметров. Проверьте, какие цифры лучше всего подходят для вашей цели и данных.
Теперь размер ядра не сравнится с LSTM. Это новая вещь, добавленная в модель.
Число 3 - очень распространенный выбор. Это означает, что свертка потребует три временных шага, чтобы произвести один временной шаг. Затем сдвиньте один шаг, чтобы выполнить другую группу из трех шагов, чтобы произвести следующий шаг и так далее.
дилатация
Расширения означают, сколько промежутков между шагами будет иметь фильтр свертки.
- Свертка
dilation_rate=1
предпринимает kernel_size
последовательных шагов, чтобы произвести один шаг.
- Свертка с
dilation_rate = 2
требует, например, шагов 0, 2 и 4 для получения шага. Затем выполняются шаги 1,3,5 для создания следующего шага и так далее.
Какое расширение должно быть установлено для представления обратного хода 10?
range = 1 + (kernel_size - 1) * dilation_rate
Итак, с размером ядра = 3:
- Dilation = 0 (dilation_rate = 1): размер ядра будет составлять 3 шага
- Дилатация = 1 (dilation_rate = 2): размер ядра будет в диапазоне 5 шагов
- Дилатация = 2 (dilation_rate = 4): размер ядра будет составлять 9 шагов
- Dilation = 3 (dilation_rate = 8): размер ядра будет составлять 17 шагов
Мой вопрос к тебе
Если вы можете «точно» объяснить, как вы структурируете свои данные, каковы исходные данные и как вы преобразуете их в форму ввода, если у вас есть независимые последовательности, если вы создаете скользящие окна и т. Д. Лучшее понимание этого процесса может быть достигнуто.