[英]ValueError: Shapes (None, 1) and (None, 3) are incompatible
我有一个音频文件的 3 维数据集,其中X.shape
是(329,20,85)
。 我想要一个简单的准系统 model 运行,所以请不要挑剔并只解决手头的问题。 这是代码:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(32, return_sequences=True, stateful=False, input_shape = (20,85,1)))
model.add(tf.keras.layers.LSTM(20))
model.add(tf.keras.layers.Dense(nb_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=["accuracy"])
model.summary()
print("Train...")
model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=50, validation_data=(X_test, y_test))
但后来我遇到了标题中提到的错误: ValueError: Shapes (None, 1) and (None, 3) are incompatible
这是model.summary()
Model: "sequential_13"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_21 (LSTM) (None, 20, 32) 15104
_________________________________________________________________
lstm_22 (LSTM) (None, 20) 4240
_________________________________________________________________
dense_8 (Dense) (None, 3) 63
=================================================================
Total params: 19,407
Trainable params: 19,407
Non-trainable params: 0
_________________________________________________________________
Train...
为此,我关注了这篇文章并将 Tensorflow 更新到最新版本,但问题仍然存在。 这篇文章完全不相关,而且非常不可靠。 这篇文章虽然有点相关,但现在暂时没有答案。
更新 1.0:
我强烈认为这个问题与我将 nb_classes 传递为 3 的最终Dense
层有关,因为我在y
中对 3 个类别进行分类。
所以我将Dense
层的nb_classes
为 1,它运行 model 并给了我这个 output,我肯定这是错误的。
Train...
9/9 [==============================] - 2s 177ms/step - loss: 0.0000e+00 - accuracy: 0.1520 - val_loss: 0.0000e+00 - val_accuracy: 0.3418
<tensorflow.python.keras.callbacks.History at 0x7f50f1dcebe0>
更新 2.0:
我对y
进行了热编码并解决了形状问题。 但是现在上面的 output 和<tensorflow.python.keras.callbacks.History at 0x7f50f1dcebe0>
仍然存在。 有什么帮助吗? 或者我应该为此发布一个新问题? 感谢所有的帮助。
我应该如何进行,或者我应该改变什么?
第一个问题是 LSTM input_shape。 input_shape = (20,85,1)
。
来自文档: https://keras.io/layers/recurrent/
LSTM 层需要3D 具有形状(batch_size、timesteps、input_dim)的张量。
model.add(tf.keras.layers.Dense(nb_classes, activation='softmax'))
- 这表明您正在进行多类分类。
所以,你需要你的y_train
和y_test
必须是单热编码的。 这意味着它们必须具有维度(number_of_samples, 3)
,其中3
表示类数。
您需要将tensorflow.keras.utils.to_categorical
应用于它们。
y_train = to_categorical(y_train, 3)
y_test = to_categorical(y_test, 3)
参考: https://www.tensorflow.org/api_docs/python/tf/keras/utils/to_categorical
tf.keras.callbacks.History()
- 此回调自动应用于每个 Keras model。 历史 object 由模型的 fit 方法返回。
参考: https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/History
检查最后一个密集层(输出)的类数是否与训练数据集中的目标类数相同。 我在训练数据集并纠正它时犯了类似的错误,这对我有帮助。
要检查的另一件事是,您的标签是单热编码还是仅整数。 看到这个帖子: https://www.kaggle.com/general/197993
出现错误是因为“categorical_crossentropy”适用于单热编码目标,而“sparse_categorical_crossentropy”适用于 integer 目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.