Tensorflow keras,基于RNN模型的MNIST分类,关于输出形状的问题

Tensorflow keras,基于RNN模型的MNIST分类,关于输出形状的问题,tensorflow,keras,Tensorflow,Keras,我正在尝试使用keras的函数API来构建一个递归神经网络,但是遇到了一些关于输出形状的问题,任何帮助都将不胜感激 我的代码: import tensorflow as tf from tensorflow.python.keras.datasets import mnist from tensorflow.python.keras.layers import Dense, CuDNNLSTM, Dropout from tensorflow.python.keras.models import

我正在尝试使用keras的函数API来构建一个递归神经网络,但是遇到了一些关于输出形状的问题,任何帮助都将不胜感激

我的代码:

import tensorflow as tf
from tensorflow.python.keras.datasets import mnist
from tensorflow.python.keras.layers import Dense, CuDNNLSTM, Dropout
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.utils import normalize
from tensorflow.python.keras.utils import np_utils

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = normalize(x_train, axis=1), normalize(x_test, axis=1)

y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)

feature_input = tf.keras.layers.Input(shape=(28, 28))
x = tf.keras.layers.CuDNNLSTM(128, kernel_regularizer=tf.keras.regularizers.l2(l=0.0004), return_sequences=True)(feature_input)
y = tf.keras.layers.Dense(10, activation='softmax')(x)
model = tf.keras.Model(inputs=feature_input, outputs=y)
opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)
model.compile(optimizer=opt, loss="sparse_categorical_crossentropy", metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
错误:

ValueError:检查目标时出错:预期密度为3维,但得到了形状为(60000,10)的数组

您的数据(目标)具有形状
(60000,10)

模型的输出(“密集”)具有形状
(无,长度,10)

其中,
None
是批次大小(变量),
length
是中间维度,表示LSTM的“时间步长”,10是
密集
层的单位

现在,在LSTM中没有任何带有时间步长的序列要处理,这是没有意义的。它将“图像行”解释为连续的时间步,“图像列”解释为独立的特征。(如果这不是您的意图,那么您很幸运,它没有给您一个尝试将图像放入LSTM的错误)

无论如何,您可以使用
return\u sequences=False
修复此错误(放弃序列的
长度
)。这并不意味着此模型适合这种情况。

您的数据(目标)具有形状
(60000,10)

模型的输出(“密集”)具有形状
(无,长度,10)

其中,
None
是批次大小(变量),
length
是中间维度,表示LSTM的“时间步长”,10是
密集
层的单位

现在,在LSTM中没有任何带有时间步长的序列要处理,这是没有意义的。它将“图像行”解释为连续的时间步,“图像列”解释为独立的特征。(如果这不是您的意图,那么您很幸运,它没有给您一个尝试将图像放入LSTM的错误)


无论如何,您可以使用
return\u sequences=False
修复此错误(放弃序列的
长度
)。这并不意味着此模型适合这种情况。

错误指向目标(标签),而不是输入形状。这是因为LSTM输出三维形状,而标签是二维的。您可能想在softmax图层之前添加一个展平。谢谢您的回复。是的,这是关于输出维度的问题。我添加了以下内容:x_flatte=tf.keras.layers.flatte()(x),但它仍然不起作用?你能帮我举个有效的例子吗。非常感谢。错误指向目标(您的标签),而不是输入形状。这是因为LSTM输出三维形状,而标签是二维的。您可能想在softmax图层之前添加一个展平。谢谢您的回复。是的,这是关于输出维度的问题。我添加了以下内容:x_flatte=tf.keras.layers.flatte()(x),但它仍然不起作用?你能帮我举个有效的例子吗。非常感谢。谢谢你的评论。使用LSTM做分类是我想要的。谢谢你的评论。使用LSTM做分类是我想要的。