Ну ... это одномерные свертки, для которых ядра трехмерны.
Это правда, что одно из этих трех измерений должно соответствовать размеру вложения (иначе было бы бессмысленно иметь этот размер)
Эти три измерения:
(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)