TensorFlow Sequential模型输入张量异常及数据集适配问题求助
自制AutoEncoder数据集报错排查
问题现象
从TensorFlow官方AutoEncoder入门示例复制的代码可正常处理Fashion MNIST数据集,但使用自制数据集时出现冗长警告及ValueError:
- 自制
x_train形状:
tf.shape(x_train) # 输出 <tf.Tensor: shape=(3,), dtype=int32, numpy=array([169,28,28])>
- MNIST数据集
x_train形状:
tf.shape(x_train) # 输出 <tf.Tensor: shape=(3,), dtype=int32, numpy=array([60000,28,28])>
自制数据集生成代码:
dir_path='auto/ttt/' data=[] x_train=[] for i in os.listdir(dir_path): img=image.load_img(dir_path+'//'+i,color_mode='grayscale',target_size=(28,28)) data=np.array(img) data=data/255.0 x_train.append(data)
收到的警告:
WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor. Received: inputs=(<tf.Tensor 'IteratorGetNext:0' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:2' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:3' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:4' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:5' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:6' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:7' shape=(None, 28) dtype=flo...
触发的ValueError:
ValueError: Exception encountered when calling layer "sequential_4" (type Sequential). Layer "flatten_2" expects 1 input(s), but it received 169 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:2' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:3' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:4' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:5' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:6' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:7' shape=(None, 28) dtype=float32>, <tf.Tensor 'IteratorGetNext:8' shape=(None, 28) dtype=float3...
问题根源
自制的x_train是Python列表,而非NumPy数组或TensorFlow张量。虽然tf.shape返回的形状看似符合要求,但当将列表传入Keras模型时,模型会把列表中的每一个28x28元素当作独立的输入张量,导致原本应该是1个批量输入(形状(169,28,28))变成了169个单独的输入,与模型期望的输入格式不匹配,从而触发警告和错误。
修复方案
在数据集生成循环结束后,将Python列表转换为NumPy数组或TensorFlow张量:
修改后的代码
import numpy as np from tensorflow.keras.preprocessing import image import os dir_path='auto/ttt/' x_train=[] for i in os.listdir(dir_path): img=image.load_img(dir_path+'//'+i,color_mode='grayscale',target_size=(28,28)) data=np.array(img) data=data/255.0 x_train.append(data) # 关键:将列表转为NumPy数组 x_train = np.array(x_train) # 或者转为TensorFlow张量:x_train = tf.convert_to_tensor(x_train)
转换后,x_train会成为标准的批量张量,形状为(169,28,28),与MNIST数据集格式一致,模型即可正常处理。
内容的提问来源于stack exchange,提问作者HARIS AAMIR
相关产品推荐
相关产品推荐

