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

use*_*651 1 numpy neural-network deep-learning keras keras-layer

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

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))
Run Code Online (Sandbox Code Playgroud)

模型:

_________________________________________________________________
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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

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

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

我怀疑问题是,对于最后一层,我只有一个输出节点,因此输出尺寸减少到两个.

Dan*_*ler 6

1D卷积期望表格中的输入(BatchSize,length,channels).
Keras会报告为(None,length,channels).

所以,你需要相应地传递input_shape.如果数据中只有一个通道,则需要将其定义为:

model.add(Conv1D(50, kernel_size=(1),
             activation='relu',
             input_shape=(50,1)))
Run Code Online (Sandbox Code Playgroud)

并确保你X_train也遵循这一点,形状像(NumberOfSamples, 50, 1).

这将输出形状的张量(NumberOfSamples,50,50)- 第一个50是从进入的长度,第二个是从图层中定义的50个过滤器.

在此之后,密集层通常期望扁平化数据,而不是2D数据.

您可以像使用它们一样使用它们,但它们会保留额外的尺寸,这似乎不是您的目的.

如果你最后只想要一个类(我猜这个),你需要在使用Dense图层之前展平你的数据:

model.add(Flatten()) #this will transform (None, 50,50) into (None,2500)
model.add(Dense(32))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)

然后你的输出确实会有形状(None,1),与你的相匹配Y_train (940,1)