检查模型目标时出错:预期 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)
匹配
我正在尝试训练这个卷积神经网络,但无法弄清楚我的最后一层有什么问题。
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)