Уровень персонажа CNN - 1D или 2D - PullRequest
1 голос
/ 26 марта 2019

Я хочу реализовать CNN на уровне персонажей в Pytorch.

Мой вход имеет 4 размеры:

(batch_size, seq_length, padded_character_length, embedding_dim)

Мне интересно, должен ли я объединить два измерения и использовать слой Conv1D или вместо этого использовать слой Conv2D для существующих измерений.

Учитывая размеры входных данных, оба технически работают нормально, я также видел реализации для обеих версий. Поэтому мне интересно, какой метод выбрать.

Обладает ли один из двух методов особыми преимуществами перед другим?

Ответы [ 3 ]

1 голос
/ 26 марта 2019

Я согласен с Venkatesh, что 1D может иметь больше смысла для вашей реализации.Вместо слияния я обычно использую слои TimeDistributed , которые находятся в Keras.Это берет один слой и применяет это к временным измерениям.Преимущество состоит в том, что вы храните элементы из каждого измерения отдельно, пока не захотите объединить их.

Если вы используете заполнение (как вы упомянули), тогда имеет смысл применить один и тот же слой по всем временным измерениям, а не объединять слои и создавать неудобное пространство между промежуточными символами.Слои TimeDistributed решают эту проблему.

Я на мгновение гуглил и нашел человека, который пытался реализовать эту функцию в PyTorch, который, по крайней мере, может помочь вам начать работу.

PyTorch TimeDistributed

Чтобы немного расширить мое использование .. Моя последняя модель имеет периоды 5, 12 часов, каждый 12-часовой период имеет спорадическую активность, поэтому она дополняется до стандартной длины 30итоговая входная форма (?, 5, 30, embedding_size).Я генерирую объекты в течение одного периода с использованием TimeDistributed 1D CNN, затем я максимально объединяю эти объекты и объединяюсь, чтобы создать новую форму (?, 5, n_feats), где теперь есть 5 наборов карт объектов.Я снова проверяю эти данные с помощью другого 1D слоя CNN, который просматривает через периоды 5, 12 часов.Заполнение в каждом периоде не зависит друг от друга, поэтому я не могу просто использовать 2D CNN, поскольку элементы с одним и тем же индексом не будут представлять одно и то же время в разных периодах.

Редактировать:

Я думаю, что реализация Keras немного сложнее, но это должно быть близко.Их документация гласит: «Эта оболочка применяет слой к каждому временному фрагменту ввода».Если для того, чтобы добраться туда, требуется объединение, восстановите после этого, возможно, существуют некоторые соображения относительно карты объектов.Например, если размер фильтра равен 2, то последний элемент в первой карте объектов (после изменения формы) будет включать в себя последний объект и первый объект между двумя временными срезами.

Вот еще одна ссылка об обсуждении этой возможности в PyTorch, которая может оказаться полезной.

1 голос
/ 26 марта 2019

Нет ничего лучше, чем лучший из Conv1D и Conv2D.

Обычно Conv1D используется для текстовых данных, а Conv2D используется для данных изображений.

Учитывая, что вы будете реализовывать символьный уровень CNN, имеет смысл использовать Conv1D.

0 голосов
/ 26 апреля 2019

Я просто хотел вернуться сюда, поскольку попробовал оба варианта, используя Conv2D и Conv1D с TimeDistributed .
После нескольких экспериментов я останусь со слоем Conv2D , так как это приведет к значительно лучшим результатам для моей установки.

Я полагаю, что результаты действительно зависят от конкретной реализации, однакоЯ не могу поддержать утверждение, что слои Conv1D обычно лучше подходят для CNN уровня персонажа.

Итак, Conv2D слоев, безусловно, стоит рассмотреть для этого приложения!

...