Tensorflow keras,基于RNN模型的MNIST分类,关于输出形状的问题
我正在尝试使用keras的函数API来构建一个递归神经网络,但是遇到了一些关于输出形状的问题,任何帮助都将不胜感激 我的代码: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
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做分类是我想要的。