TensorFlow Sequential层输入形状不兼容问题求解
解决输入形状不匹配的问题
你的问题核心是模型期望的输入形状和训练数据形状不匹配:模型定义时指定了input_shape=(1, 5),意味着每个样本需要是(1,5)的二维结构(对应整体输入张量形状为(None,1,5),None代表样本数量可变),但你的X_train是(371,5)的二维张量,每个样本是一维的5个特征,因此触发了形状不兼容的错误。
下面给出两种直接的解决办法:
方法一:修改模型的输入形状(推荐)
既然训练数据每个样本是5个特征,直接把模型的输入形状改成(5,),甚至可以去掉Flatten层(Dense层本身就能处理(样本数, 特征数)的二维输入):
import tensorflow as tf from sklearn import metrics model = tf.keras.Sequential() # 直接指定输入形状为(5,),无需Flatten层 model.add(tf.keras.layers.Dense(200, activation='sigmoid', input_shape=(5,))) model.add(tf.keras.layers.Dense(3, activation='softmax')) opt = tf.keras.optimizers.SGD(learning_rate=0.9) model.compile(optimizer=opt, loss=tf.keras.losses.SparseCategoricalCrossentropy()) model.fit(X_train, y_train, epochs=10)
如果一定要保留Flatten层,也可以这么写:
model = tf.keras.Sequential() model.add(tf.keras.layers.Flatten(input_shape=(5,))) model.add(tf.keras.layers.Dense(200, activation='sigmoid')) model.add(tf.keras.layers.Dense(3, activation='softmax'))
方法二:调整训练数据的形状
如果不想改动模型结构,可以给X_train增加一个维度,让它变成(371,1,5)的形状,匹配模型的输入要求:
import tensorflow as tf from sklearn import metrics import numpy as np # 将DataFrame转为numpy数组,并新增一个维度 X_train_reshaped = X_train.values.reshape(-1, 1, 5) model = tf.keras.Sequential() model.add(tf.keras.layers.Flatten(input_shape=(1, 5))) model.add(tf.keras.layers.Dense(200, activation='sigmoid')) model.add(tf.keras.layers.Dense(3, activation='softmax')) opt = tf.keras.optimizers.SGD(learning_rate=0.9) model.compile(optimizer=opt, loss=tf.keras.losses.SparseCategoricalCrossentropy()) # 使用调整后的训练数据 model.fit(X_train_reshaped, y_train, epochs=10)
另外你之前尝试的X_train[1]是取数据集中的第二行样本,这显然不对——训练需要传入整个数据集,只是形状需要调整。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

