如何堆叠图像张量以在Keras中训练卷积神经网络(CNN)?
在Keras中堆叠图像张量训练CNN的正确方法
你的代码报错原因很明确:
- 执行
tf.reshape(tensor, [1,128,128,3])时没把结果赋值给tensor,所以tensor还是(128,128,3)的3维形状 - 后续用
tf.stack([mask_tensor, tensor])时,mask_tensor已经是(batch_size,128,128,3)的4维张量,两者维度不匹配,导致元素数量计算错误
下面给你几种正确的实现方式:
方法1:列表收集后一次性堆叠
这是最直观高效的方式,先把所有处理好的张量存进列表,最后统一堆叠成批量张量:
mask_tensors = [] for img in mask_img: image = tf.io.read_file(img) tensor = tf.io.decode_jpeg(image, channels=3) tensor = tf.image.resize(tensor, [128, 128]) mask_tensors.append(tensor) # 堆叠后得到形状为 (样本数, 128, 128, 3) 的张量 mask_tensor = tf.stack(mask_tensors, axis=0)
方法2:循环中用tf.concat逐步拼接
如果一定要在循环里逐步构建批量张量,可以用tf.concat(注意保持维度一致):
# 初始化第一个张量并增加batch维度 image = tf.io.read_file(mask_img[0]) mask_tensor = tf.io.decode_jpeg(image, channels=3) mask_tensor = tf.image.resize(mask_tensor, [128, 128]) mask_tensor = tf.expand_dims(mask_tensor, axis=0) # 处理剩余图像 for img in mask_img[1:]: image = tf.io.read_file(img) tensor = tf.io.decode_jpeg(image, channels=3) tensor = tf.image.resize(tensor, [128, 128]) tensor = tf.expand_dims(tensor, axis=0) # 在batch维度拼接 mask_tensor = tf.concat([mask_tensor, tensor], axis=0)
方法3:用tf.data.Dataset(训练推荐)
实际训练CNN时,更推荐用TensorFlow数据集API,它能自动处理批量、并行加载等,不用手动堆叠:
def load_and_preprocess(img_path): image = tf.io.read_file(img_path) tensor = tf.io.decode_jpeg(image, channels=3) tensor = tf.image.resize(tensor, [128, 128]) # 可添加归一化操作,比如转成float并除以255 tensor = tf.cast(tensor, tf.float32) / 255.0 return tensor # 创建数据集 dataset = tf.data.Dataset.from_tensor_slices(mask_img) dataset = dataset.map(load_and_preprocess, num_parallel_calls=tf.data.AUTOTUNE) # 设置批量大小 dataset = dataset.batch(32) # 后续直接将数据集喂给模型训练即可 # model.fit(dataset, epochs=10)
内容的提问来源于stack exchange,提问作者user19676560
相关产品推荐
相关产品推荐

