ValueError:形状(无,1)和(无,3)不兼容

abh*_*901 15 python keras tensorflow

我的音频文件,其中一个三维数据集X.shape(329,20,85)。我想运行一个简单的准系统模型,所以请不要挑剔并只解决手头的问题。这是代码:

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

但是后来我遇到了标题中提到的错误: 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...
Run Code Online (Sandbox Code Playgroud)

为此,我关注了这篇文章并将 Tensorflow 更新到了最新版本,但问题仍然存在。这篇文章完全无关,而且非常不可靠。这篇文章虽然有点相关,但有一段时间没有得到答复。

更新 1.0:

我强烈认为这个问题与Dense我将 nb_classes 传递为 3的最后一层有关,因为我在y.

所以我将Dense图层更改nb_classes为 1,它运行模型并给我这个输出,我肯定这是错误的。

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

更新 2.0:

我对ys 进行了热编码并解决了形状问题。但是现在上面的输出<tensorflow.python.keras.callbacks.History at 0x7f50f1dcebe0>仍然存在。有什么帮助吗?或者我应该为此发布一个新问题?感谢所有的帮助。

我应该如何进行,或者我应该改变什么?

Zab*_*azi 24

第一个问题是 LSTM input_shape。input_shape = (20,85,1).

来自文档:https : //keras.io/layers/recurrent/

LSTM 层需要具有形状(batch_size、timesteps、input_dim)的 3D 张量。

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

参考:https : //www.tensorflow.org/api_docs/python/tf/keras/utils/to_categorical

tf.keras.callbacks.History()- 此回调会自动应用于每个 Keras 模型。History 对象由模型的 fit 方法返回。

参考:https : //www.tensorflow.org/api_docs/python/tf/keras/callbacks/History


小智 9

检查最后一个密集层(输出)的类数是否与训练数据集中的目标类数相同。我在训练数据集并纠正它时犯了类似的错误对我有帮助。


use*_*824 8

另一件要检查的事情是您的标签是否是单热编码的,或者只是整数。请参阅这篇文章: https: //www.kaggle.com/general/197993

出现错误的原因是“categorical_crossentropy”适用于单热编码目标,而“sparse_categorical_crossentropy”适用于整数目标。