Вот документация для модуля Keras Conv1D , где они описывают входные данные для модели как фиксированное или переменное число последовательностей фиксированной длины (как указано в примере (10,128): 10 последовательности, каждая длиной 128).
1D свертка может рассматриваться как проходящая через одно пространственное или временное измерение двумерных данных. Этот ответ переполнение стека дает довольно четкое объяснение различных типов Conv Layers.
В связи с вашей проблемой я создал игрушечную программу с двумя слоями конвивов и случайными данными, которые, я думаю, вам могут пригодиться.
data = np.random.random((64,4,4))
labels = np.random.random((64,2))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
dataset = dataset.batch(2).repeat()
inputs = Input(shape=(4,4))
x = Conv1D(32, 3, activation='relu')(inputs)
x = Flatten()(x)
x = Dense(32, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
model.fit(dataset.make_one_shot_iterator(), epochs=5, steps_per_epoch=100)
Результат:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 4, 4) 0
_________________________________________________________________
conv1d (Conv1D) (None, 2, 32) 416
_________________________________________________________________
flatten (Flatten) (None, 64) 0
_________________________________________________________________
dense (Dense) (None, 32) 2080
_________________________________________________________________
dense_1 (Dense) (None, 2) 66
=================================================================
Total params: 2,562
Trainable params: 2,562
Non-trainable params: 0
Epoch 1/5
100/100 [==============================] - 1s 11ms/step - loss: 0.7027 - acc: 0.5450
Epoch 2/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6874 - acc: 0.6000
Epoch 3/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6838 - acc: 0.6200
Epoch 4/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6753 - acc: 0.6100
Epoch 5/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6656 - acc: 0.6300
теперь вы можете заменить 4 там формой (no_of_sequence, 4) и определить свою собственную модель таким образом.
Однако, если вы хотите использовать что-то вроде (None, 4), в случае, когда ваши последовательности являются переменными и нет фиксированной длины, которую вы можете выбрать, вы столкнетесь с проблемами со слоем Dense при использовании серверной части Tensorflow, которая требует последнее измерение ввода.
Так что вы могли бы выбрать лучшую форму, соответствующую этому требованию.