如何将列表格式的训练数据输入至Keras模型?
问题描述
刚接触TensorFlow与Keras,现有如下格式的训练数据集:
x_train = [[ 21 0 0 ... 0 0 0] [ 22 0 0 ... 0 0 0] [ 23 0 0 ... 0 0 0] ... [255 0 0 ... 0 0 0] [256 0 0 ... 0 0 0] [257 0 0 ... 0 0 0]] y_train = [4 1 1 1 4 1 3 1 2 4 4 1 1 4 4 4 1 1 1 4 4 1 4 4 1 1 4 1 4 1 3 1 1 1 1 1 4 3 4 1 1 4 3 1 4 4 1 4 1 3 1 1 1 1 4 1 1 1 4 4 1 1 1 4 1 3 4 4 1 4 1 2 1 4 4 1 1 4 1 4 4 3 4 1 3 1 1 3 1 4 2 4 2 2 1 4 3 1 1 4 2 1 3 1 4 4 1 3 4 4 1 1 1 3 3 4 1 4 1 1 4 4 1 4 4 4 1 1 3 4 1 2 4 1 4 4 1 4 4 1 1 4 1 4 4 4 4 1 1 4 4 1 1 1 1 1 1 4 4 1 4 4 1 1 4 1 1 1 4 4 1 4 4 1 4 1 1 2 1 1 1 1 4 1 1 1 4 1 1 4 1 1 4 4 1 3 4 3 4 1 1 1 1 1 4 4 1 4 4 4 4 1 1 1 4 3 4 2 1 4 4 1 4 1 1 4 4 1 4 4 1 4 4 4 1 4 1 2 4 1 1 1 1 4 1 4 4 4 4 1 1 1 4 1 4 4 4 1 4 1 1 4 4]
参考网上教程尝试了以下代码,但模型无法接受列表输入,请问该如何将这些数据输入模型?
model = keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10) ]) model.compile(optimizer='adam', loss = 'binary_crossentropy',metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, batch_size=32)
解决步骤
1. 转换数据格式为NumPy数组
Keras模型不直接支持Python列表作为输入,必须先将数据转换成NumPy数组:
import numpy as np # 转换训练数据 x_train = np.array(x_train) y_train = np.array(y_train)
2. 匹配输入数据与模型输入形状
你的Flatten层指定了input_shape=(28,28),意味着每个输入样本是28×28的二维数组。但从x_train的格式看,每个样本是一维列表,需按实际情况调整:
- 如果每个样本长度是784(28×28),用
reshape转成二维:x_train = x_train.reshape(-1, 28, 28) - 如果样本长度不是784,直接修改
Flatten层的input_shape为实际的一维长度,比如input_shape=(N,),Flatten层会自动处理。
3. 修正多分类任务的模型配置
从y_train的标签值(1、2、3、4)来看,这是4分类任务,当前模型有两处错误需要修正:
- 损失函数:
binary_crossentropy是二分类专用,多分类应使用sparse_categorical_crossentropy(标签为整数格式时) - 输出层单元数:
Dense(10)不符合4分类需求,应设置为4,同时可添加softmax激活函数输出概率
调整后的模型代码:
model = keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), # 确保与x_train形状匹配 tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(4, activation='softmax') # 4个类别,输出概率分布 ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', # 适配整数标签的多分类损失 metrics=['accuracy'])
4. 归一化输入数据(可选但推荐)
图像类数据归一化到0-1范围能提升模型训练效率:
x_train = x_train / 255.0 # 假设数据值范围为0-255
5. 启动模型训练
完成以上步骤后,即可正常调用fit方法训练模型:
model.fit(x_train, y_train, epochs=10, batch_size=32)
内容的提问来源于stack exchange,提问作者Shreyas Krishna Kumar
相关产品推荐
相关产品推荐

