Ошибка измерения для convolution2d в keras для классификации текста

Моя форма ввода представляет собой текстовый документ размером 10000x500. 10000 представляет количество документов, а 500 — количество слов.

То, что я пытаюсь сделать, это передать текст для встраивания kera, за которым следует BLSTM, а затем Conv2D, а затем 2Dpooling, сглаживание и, наконец, полностью связанный плотный слой.

Архитектура показана ниже:

inp = Input(shape=(500,))
x = Embedding(max_features=10000, embed_size=100)(inp)
x = Bidirectional(CuDNNLSTM(50, return_sequences=True))(x)
x = Conv2D(filters=128, kernel_size=(3, 3), input_shape=(100,500,1))(x)
x = MaxPooling2D()(x)
x = Flatten()(x)
x = Dense(1, activation="sigmoid")(x)

Выходная форма встраивания будет (Нет, 500, 100). Выходная форма из скрытого состояния BLSTM будет (Нет, 500, 100). Я хотел бы, чтобы Conv2D извлекал локальные функции по скрытым слоям из BLSTM. Однако у меня возникает ошибка несоответствия размеров.

ValueError: Input 0 is incompatible with layer conv2d_8: expected ndim=4, found ndim=3

Я пробовал решение здесь -sense-to?rq=1">При создании CNN я получаю жалобы от Кераса, которые не имеют для меня смысла. но все еще получаю сообщение об ошибке.


person ohmyan    schedule 22.06.2018    source источник


Ответы (1)


У вас есть два варианта:

a) Используйте Conv2D с rows=100, cols=500 и channels=1, добавив измерение к x:

x = Lambda(lambda t: t[..., None])(x)
x = Conv2D(filters=128, kernel_size=(3, 3), input_shape=(100,500,1))(x)

б) Используйте Conv1D с steps=100 и input_dim=500 и используйте MaxPooling1D:

x = Conv1D(filters=128, kernel_size=3, input_shape=(100, 500))(x)
x = MaxPooling1D()(x)
x = Flatten()(x)
person rvinas    schedule 23.06.2018
comment
что лямбда-функция на самом деле делает с формой? - person ohmyan; 25.06.2018
comment
Он добавляет одно измерение на последней оси. Это эквивалентно keras.io/backend/#expand_dims с axis=-1. - person rvinas; 26.06.2018