检查模型目标时出错:预期 dense_39 有 3 个维度,但得到形状为 (940, 1) 的数组

Error when checking model target: expected dense_39 to have 3 dimensions, but got array with shape (940, 1)

我正在尝试训练这个卷积神经网络,但无法弄清楚我的最后一层有什么问题。

model = Sequential()
model.add(Conv1D(50, kernel_size=(1),
                 activation='relu',
                 input_dim=50))
model.add(Dense(32))
model.add(Dense(1))
model.summary()
model.compile(loss=keras.losses.mean_squared_error,
              optimizer=keras.optimizers.adam())

model.fit(X_train, y_train,
          batch_size=940,
          epochs=10,
          verbose=1,
          validation_data=(X_test, y_test))

型号:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_26 (Conv1D)           (None, None, 50)          2550      
_________________________________________________________________
dense_38 (Dense)             (None, None, 32)          1632      
_________________________________________________________________
dense_39 (Dense)             (None, None, 1)           33        
=================================================================
Total params: 4,215.0
Trainable params: 4,215
Non-trainable params: 0.0
_________________________________________________________________

我总是收到以下错误消息:

ValueError: Error when checking model target: expected dense_39 to have 3 dimensions, but got array with shape (940, 1)

我怀疑问题是最后一层我只有一个输出节点,所以输出维度减少到两个。

一维卷积需要以 (BatchSize,length,channels).
形式输入 Keras 会将其报告为 (None,length,channels)

因此,您需要相应地传递 input_shape。如果您的数据中只有一个通道,则需要将其定义为:

model.add(Conv1D(50, kernel_size=(1),
             activation='relu',
             input_shape=(50,1)))

并确保您的 X_train 也遵循此规则,形状像 (NumberOfSamples, 50, 1)

这将输出形状为 (NumberOfSamples,50,50) 的张量 - 第一个 50 来自传入的长度,第二个来自层中定义的 50 个过滤器。

在那之后,密集层通常需要扁平化数据,而不是二维数据。

你可以像以前一样使用它们,但它们会保留额外的维度,这似乎不是你的目的。

如果最后只想要一个 class(我猜是这样),则需要在使用密集层之前展平数据:

model.add(Flatten()) #this will transform (None, 50,50) into (None,2500)
model.add(Dense(32))
model.add(Dense(1))

那么您的输出确实具有形状 (None,1),与您的 Y_train (940,1)

匹配