深度学习CNN训练时触发ValueError: as_list() is not defined on an unknown TensorShape错误的解决求助
深度学习CNN训练时触发ValueError: as_list() is not defined on an unknown TensorShape错误的解决求助
大家好,我最近在做一个5分类的图像CNN项目,已经走完了数据加载、预处理、数据集划分和模型搭建的步骤,但一启动训练就会抛出ValueError: as_list() is not defined on an unknown TensorShape错误,折腾两天了还是没解决,来求助各位大佬!
我的操作步骤如下:
- 数据加载与预处理
我用image_dataset_from_directory加载本地数据集,然后定义了预处理函数做像素归一化和标签独热编码,代码如下:
import tensorflow as tf # 加载图像数据集 data = tf.keras.utils.image_dataset_from_directory('/content/drive/MyDrive/PengantarSainsData/Capstone2/dataset_revisi') data_iterator = data.as_numpy_iterator() batch = data_iterator.next() # 自定义预处理函数:归一化图像+独热编码标签 def preprocess(x, y): x_normalized = x / 255 y_one_hot = tf.keras.utils.to_categorical(y, num_classes=5) return x_normalized, y_one_hot # 对数据集应用预处理 data = data.map(lambda x, y: tf.py_function(func=preprocess, inp=[x, y], Tout=[tf.float32, tf.float32])) scaled_iterator = data.as_numpy_iterator() batch = scaled_iterator.next()
- 划分训练/验证/测试集
按7:2:1的比例划分了数据集:
# 计算各数据集大小 train_size = int(len(data) * .7) val_size = int(len(data) * .2) test_size = int(len(data) * .1) # 拆分数据集 train = data.take(train_size) val = data.skip(train_size).take(val_size) test = data.skip(train_size + val_size).take(test_size)
- 模型搭建
最初我搭建了一个简单的CNN模型:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense model = Sequential() # 输入层+第一卷积块 model.add(Conv2D(16, (3, 3), 1, activation='relu', input_shape=(256, 256, 3))) model.add(MaxPooling2D()) # 第二卷积块 model.add(Conv2D(32, (3, 3), 1, activation='relu')) model.add(MaxPooling2D()) # 第三卷积块 model.add(Conv2D(16, (3, 3), 1, activation='relu')) model.add(MaxPooling2D()) # 全连接层 model.add(Flatten()) model.add(Dense(128, activation='relu')) # 输出层(5分类) model.add(Dense(5, activation='softmax')) # 编译模型 model.compile('adam', loss='categorical_crossentropy', metrics=['accuracy']) model.summary()
- 启动训练(触发错误)
我添加了TensorBoard回调来监控训练,执行训练代码时就报错了:
logdir = 'logs' tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir) # 触发错误的代码 hist = model.fit(train, epochs=16, validation_data=val, callbacks=[tensorboard_callback])
我已经尝试过的解决方法:
- 更换了模型结构,并且显式调用
model.build(input_shape=(None, 256, 256, 3))来指定输入形状,但问题依然存在。
有没有朋友遇到过类似的问题?或者能帮我定位下错误的根源?感谢大家的帮助!
备注:内容来源于stack exchange,提问作者Dyni15
相关产品推荐
相关产品推荐

