Keras model shape incompatible / ValueError: Shapes (None, 3) and (None, 3, 3) are incompatible
Keras model shape incompatible / ValueError: Shapes (None, 3) and (None, 3, 3) are incompatible
我正在尝试训练我的 keras 模型,但形状不兼容。
错误说
ValueError: Shapes (None, 3) and (None, 3, 3) are incompatible
我的火车集的形状是 (2000, 3, 768) 而标签的形状是 (2000, 3)。
有什么不对的地方吗?
模型定义和拟合代码
input_shape = x_train.shape[1:]
model = my_dnn(input_shape, 3)
model.fit(x_train, y_train, epochs=25, verbose=1)
型号代码
def my_dnn(input, num_classes):
model = Sequential()
model.add(tf.keras.Input(input))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(225))
model.add(Activation('relu'))
model.add(Dense(100))
model.add(Activation('relu'))
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))
model.compile( loss='categorical_crossentropy',
optimizer='adam',
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
return model
有两个可能的原因:
- 您的问题是多 class class 化,因此您需要
softmax
而不是 sigmoid
+ accuracy
或 CategoricalAccuracy()
作为一个指标。
- 你的问题是多标签class化,因此你需要
binary_crossentropy
和tf.keras.metrics.BinaryAccuracy()
根据您的数据集如何 built/the 您要尝试解决的任务,您需要选择其中之一。
对于情况 1,请确保您的数据是 OHE(单热编码)。
此外,Marco Cerliani 和 Amir(在下面的评论中)指出数据输出需要采用 2D 格式而不是 3D 格式:您应该在将数据提供给网络之前对数据进行相应的预处理,或者使用,正如下面评论中所建议的,Flatten()
在某个点(可能在最后的 Dense()
之前)
除了所说的之外,您似乎一直在携带输入数据的第二个维度,直到模型结束。所以你的模型总结是这样的:
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 3, 1024) 787456
_________________________________________________________________
activation_1 (Activation) (None, 3, 1024) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 3, 1024) 0
_________________________________________________________________
dense_2 (Dense) (None, 3, 512) 524800
_________________________________________________________________
activation_2 (Activation) (None, 3, 512) 0
_________________________________________________________________
dense_3 (Dense) (None, 3, 225) 115425
_________________________________________________________________
activation_3 (Activation) (None, 3, 225) 0
_________________________________________________________________
dense_4 (Dense) (None, 3, 100) 22600
_________________________________________________________________
activation_4 (Activation) (None, 3, 100) 0
_________________________________________________________________
dense_5 (Dense) (None, 3, 3) 303
_________________________________________________________________
activation_5 (Activation) (None, 3, 3) 0
=================================================================
Total params: 1,450,584
Trainable params: 1,450,584
Non-trainable params: 0
如您所见,模型(None, 3, 3)
的输出形状与标签的形状(None, 3)
不兼容,在某些时候,您需要使用Flatten
层.
我正在尝试训练我的 keras 模型,但形状不兼容。 错误说
ValueError: Shapes (None, 3) and (None, 3, 3) are incompatible
我的火车集的形状是 (2000, 3, 768) 而标签的形状是 (2000, 3)。
有什么不对的地方吗?
模型定义和拟合代码
input_shape = x_train.shape[1:]
model = my_dnn(input_shape, 3)
model.fit(x_train, y_train, epochs=25, verbose=1)
型号代码
def my_dnn(input, num_classes):
model = Sequential()
model.add(tf.keras.Input(input))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(225))
model.add(Activation('relu'))
model.add(Dense(100))
model.add(Activation('relu'))
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))
model.compile( loss='categorical_crossentropy',
optimizer='adam',
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
return model
有两个可能的原因:
- 您的问题是多 class class 化,因此您需要
softmax
而不是sigmoid
+accuracy
或CategoricalAccuracy()
作为一个指标。 - 你的问题是多标签class化,因此你需要
binary_crossentropy
和tf.keras.metrics.BinaryAccuracy()
根据您的数据集如何 built/the 您要尝试解决的任务,您需要选择其中之一。
对于情况 1,请确保您的数据是 OHE(单热编码)。
此外,Marco Cerliani 和 Amir(在下面的评论中)指出数据输出需要采用 2D 格式而不是 3D 格式:您应该在将数据提供给网络之前对数据进行相应的预处理,或者使用,正如下面评论中所建议的,Flatten()
在某个点(可能在最后的 Dense()
之前)
除了所说的之外,您似乎一直在携带输入数据的第二个维度,直到模型结束。所以你的模型总结是这样的:
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 3, 1024) 787456
_________________________________________________________________
activation_1 (Activation) (None, 3, 1024) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 3, 1024) 0
_________________________________________________________________
dense_2 (Dense) (None, 3, 512) 524800
_________________________________________________________________
activation_2 (Activation) (None, 3, 512) 0
_________________________________________________________________
dense_3 (Dense) (None, 3, 225) 115425
_________________________________________________________________
activation_3 (Activation) (None, 3, 225) 0
_________________________________________________________________
dense_4 (Dense) (None, 3, 100) 22600
_________________________________________________________________
activation_4 (Activation) (None, 3, 100) 0
_________________________________________________________________
dense_5 (Dense) (None, 3, 3) 303
_________________________________________________________________
activation_5 (Activation) (None, 3, 3) 0
=================================================================
Total params: 1,450,584
Trainable params: 1,450,584
Non-trainable params: 0
如您所见,模型(None, 3, 3)
的输出形状与标签的形状(None, 3)
不兼容,在某些时候,您需要使用Flatten
层.