Форма 1D сверточной нейронной сети 'ValueError'

Я генерирую 1D Convolution и у меня возникли проблемы с формой ввода моих данных. Я просмотрел несколько постов, и, похоже, ошибка заключалась в том, что данные должны быть 3D, но мои данные уже 3D.

# shape
# x_train shape: (1228, 1452, 20)
# y_train shape: (1228, 1452, 8)
# x_val shape: (223, 680, 20)
# x_val shape: (223, 680, 8)

###
n_outputs = 8
n_timesteps = 1452
n_features = 20

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(x_train.shape[1:]))) # ie 1452, 20
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=9, 
                batch_size=64, 
                shuffle=True)

Но я продолжаю получать это сообщение об ошибке:

ValueError: A target array with shape (1228, 1452, 8) was passed for an output of shape (None, 8) while using as loss `categorical_crossentropy`. This loss expects targets to have the same shape as the output.

Из этого я заключаю, что 3-мерная форма цели не совпадает с 2-мерным выходом, и поэтому она не может компенсировать потери, но мне просто нужно найти способ изменить форму так, чтобы они были равны.

РЕДАКТИРОВАТЬ model.summary() показано ниже

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, 1450, 64)          3904      
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 1448, 64)          12352     
_________________________________________________________________
dropout (Dropout)            (None, 1448, 64)          0         
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 724, 64)           0         
_________________________________________________________________
flatten (Flatten)            (None, 46336)             0         
_________________________________________________________________
dense (Dense)                (None, 100)               4633700   
_________________________________________________________________
dense_1 (Dense)              (None, 8)                 808       
=================================================================
Total params: 4,650,764
Traceback (most recent call last):
Trainable params: 4,650,764
Non-trainable params: 0

Всего 1 ответ


Проблема в моем случае заключалась в том, что целевой вектор был 3D, а выходной вектор - 2D, и поэтому существует очевидное несоответствие. Чтобы решить эту проблему, измените форму y_train на (batch, 8) или используйте return_sequences=True чтобы вернуть ту же форму из предыдущего слоя LSTM.


Есть идеи?

10000