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

时间:2020-05-01 20:09:59

标签: python tensorflow keras

我有一个音频文件的3维数据集,其中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))

我以前有这个错误 ValueError: Input 0 of layer lstm_20 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 20, 85, 1]通过将input_shape更改为(20,85)来解决this发布后的问题。

但是随后出现标题中提到的错误: 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...

为此,我关注了this帖子,并将Tensorflow更新为最新版本,但问题仍然存在。 This帖子是完全不相关且高度不可靠的。This帖子虽然暂时还没有得到解答,但仍然存在。

更新1.0:

我强烈认为问题与最后的Dense层有关,因为我要在y中对3个类别进行分类,所以我将nb_classes传递为3。

因此,我将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>

更新2.0:

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

我应该如何进行或应该更改什么?

2 个答案:

答案 0 :(得分:8)

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

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

LSTM层期望 3D张量具有形状(batch_size,时间步长,input_dim)。

model.add(tf.keras.layers.Dense(nb_classes, activation='softmax'))-这表明您正在执行多类分类。

因此,您需要将y_trainy_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)

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

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

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

答案 1 :(得分:2)

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