несовместимый по размеру плотный слой после выравнивания в кератах в сверточных моделях вложения слов - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь построить сверточную нейронную сеть, чтобы классифицировать набор новостей по 3 категориям. Идея состоит в том, чтобы собрать все новостные блоки в блоки максимум по 10 новостей в минуту, причем каждая новость должна содержать не более 30 слов; поэтому каждый образец должен состоять из тензора измерений (образец, 10, 30). Это входные данные для операции внедрения, которая выводит тензор размера (sample, 10, 30, 200), где 200 - размер для каждого слова.

чем я передаю этот встроенный вход в сверточную операцию, я выравниваю его, а затем передаю в плотный слой для конечных выходов (3 метки). Модель выглядит следующим образом:

news_inputs = Input(shape=(n_news_per_min, n_words_per_news, ), name='news_per_min')
news_inputs_embeddings = Embedding(input_dim=vocab_size, 
                                   output_dim=embedding_dim, 
                                   input_length=n_words_per_news,                                   
                                   weights = [embedding_weights],
                                   trainable=False)(news_inputs)
conv = Conv2D(32, 3, padding='same')(news_inputs_embeddings)
flat = Flatten()(conv)
dense = Dense(16, activation = 'relu')(flat)
out = Dense(3, activation='softmax')(dense)
model = Model(inputs=news_inputs, outputs=out)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])

более глубокий взгляд на созданные объекты дает следующее:

news_inputs:
<tf.Tensor 'news_per_min_9:0' shape=(?, 10, 30) dtype=float32>

news_inputs_embeddings:
<tf.Tensor 'embedding_10/Gather:0' shape=(?, 10, 30, 200) dtype=float32>

conv:
<tf.Tensor 'conv2d_11/BiasAdd:0' shape=(?, 10, 30, 32) dtype=float32>

flat:
<tf.Tensor 'flatten_5/Reshape:0' shape=(?, ?) dtype=float32>

dense:
<tf.Tensor 'dense_11/Relu:0' shape=(?, 16) dtype=float32>

out:
<tf.Tensor 'dense_12/Softmax:0' shape=(?, 3) dtype=float32>

Сводка модели выглядит следующим образом:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
news_per_min (InputLayer)    (None, 10, 30)            0         
_________________________________________________________________
embedding_12 (Embedding)     (None, 30, 200)           87766800  
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 30, 32)            57632     
_________________________________________________________________
flatten_7 (Flatten)          (None, 960)               0         
_________________________________________________________________
dense_15 (Dense)             (None, 16)                15376     
_________________________________________________________________
dense_16 (Dense)             (None, 3)                 51        
=================================================================
Total params: 87,839,859
Trainable params: 73,059
Non-trainable params: 87,766,800

кажется, что все работает нормально, когда я его компилирую, но как примерка, так и прогнозирование приводят к этой ошибке:

model.fit(X_train, y_train, batch_size=16)
InvalidArgumentError: Matrix size-incompatible: In[0]: [16,9600], In[1]: [960,16]
     [[Node: dense_15/MatMul = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/gpu:0"](flatten_7/Reshape, dense_15/kernel/read)]]
     [[Node: loss_7/mul/_157 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_693_loss_7/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Caused by op 'dense_15/MatMul', defined at:

Похоже, что первый Плотный слой ('Dense_15') не может подключиться к сплющенному извилистому слою, но я застрял, понимая, почему.

Кроме того, попытка добавить слой MaxPooling после свертки приводит к ошибке (я не включаю ее здесь, но она говорит "IndexError: tuple index out of range", поэтому я предполагаю, что что-то не так с измерением слоя conv. Любая помощь, пожалуйста?

...