Я пытаюсь построить сверточную нейронную сеть, чтобы классифицировать набор новостей по 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.
Любая помощь, пожалуйста?