我正在尝试训练这个卷积神经网络,但无法弄清楚我的最后一层是什么问题。
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:检查模型目标时出错:期望dense_39有3个维度,但得到的数组有形状(940,1)
我怀疑问题是,对于最后一层,我只有一个输出节点,因此输出尺寸减少到两个。
答案 0 :(得分:6)
1D卷积需要(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个过滤器。
之后,密集层通常会出现扁平化数据,而不是2D数据。
您可以像使用它们一样使用它们,但它们会保留额外的尺寸,而这似乎不是您的目的。
如果你最后只想要一个课程(我猜测那个),你需要在使用Dense图层之前展平你的数据:
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)