You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

深度学习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错误,折腾两天了还是没解决,来求助各位大佬!

我的操作步骤如下:

  1. 数据加载与预处理
    我用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()
  1. 划分训练/验证/测试集
    按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)
  1. 模型搭建
    最初我搭建了一个简单的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()
  1. 启动训练(触发错误)
    我添加了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:09:34