Должен ли размер ядра соответствовать размеру слова в 1D Convolution? - PullRequest
0 голосов
/ 03 декабря 2018

В литературе CNN часто иллюстрируется, что размер ядра совпадает с размером самого длинного слова в списке словаря, которое есть у него, когда оно перебирает предложение.

Так что, если мы используем вложение для представлениятекст, тогда не должен ли размер ядра быть таким же, как размер встраивания, чтобы он давал тот же эффект, что и разметка слово за словом?

Я вижу различия в размерах используемого ядра, несмотря на длину слова.

enter image description here

1 Ответ

0 голосов
/ 03 декабря 2018

Ну ... это одномерные свертки, для которых ядра трехмерны.

Это правда, что одно из этих трех измерений должно соответствовать размеру вложения (иначе было бы бессмысленно иметь этот размер)

Эти три измерения:

(length_or_size, input_channels, output_channels)  

Где:

  • length_or_size (kernel_size): все, что вы хотите.На рисунке 6 различных фильтров с размерами 4, 4, 3, 3, 2, 2, представленных «вертикальным» размером.
  • input_channels (автоматически embedding_size): размер вложения - это то, что обязательно (в Керасе это автоматически и почти невидимо), иначе умножения не будут использовать все вложение, чтобессмысленно.На рисунке «горизонтальный» размер фильтров постоянно равен 5 (то же самое, что размер слова - это не пространственное измерение).
  • output_channels (filters): все, что вы хотите, но кажется, что картинка говорит об 1 канале только на фильтр, так как она полностью игнорируется, и в случае ее представления будет что-то вроде «глубины».

Итак, вы, вероятно, путаете, какие измерения какие.Когда вы определяете слой конвона, вы делаете:

Conv1D(filters = output_channels, kernel_size=length_or_size)

В то время как input_channels происходит из встраивания (или предыдущего слоя) автоматически.

Создание этой модели в Keras

Чтобы создать эту модель, это было бы что-то вроде:

sentence_length = 7
embedding_size=5

inputs = Input((sentence_length,))
out = Embedding(total_words_in_dic, embedding_size)

Теперь, предположим, что эти фильтры имеют только 1 канал (так как изображение, кажется, не учитывает их глубину ...), мыможно объединить их в пары из 2 каналов:

size1 = 4
size2 = 3
size3 = 2
output_channels=2

out1 = Conv1D(output_channels, size1, activation=activation_function)(out)
out2 = Conv1D(output_channels, size2, activation=activation_function)(out)
out3 = Conv1D(output_channels, size3, activation=activation_function)(out)

Теперь давайте свернем пространственные измерения и останемся с двумя каналами:

out1 = GlobalMaxPooling1D()(out1)
out2 = GlobalMaxPooling1D()(out2)
out3 = GlobalMaxPooling1D()(out3)

И создадим 6-канальный выход:

out = Concatenate()([out1,out2,out3])

Теперь происходит таинственный переход от 6 каналов к 2 каналам, что невозможно объяснить изображением.Возможно, они наносят плотный слой или что-то .......

#????????????????
out = Dense(2, activation='softmax')(out)

model = Model(inputs, out)
...