使用TensorFlow 1.5 GPU版时tf.train.batch生成张量形状异常求助
解决tf.train.batch生成多余维度的问题
嘿,我之前也碰到过类似的坑!你看到的额外维度(第二个8)其实是因为传入tf.train.batch的Images列表结构不对——里面的每个元素本身就是一个批次(形状为(8,299,299,3)),而不是单个样本的张量。tf.train.batch会对输入的每个元素做批次打包,要是输入列表里已经是批次级别的数据,叠加后自然就多出来一个维度了。
下面是具体的排查和解决步骤:
第一步:先确认输入数据的形状
在调用tf.train.batch之前,先打印Images列表里单个元素的形状,验证是不是这个问题:print("单个Image元素的形状:", Images[0].shape)如果输出是
(8, 299, 299, 3),那就能确定——你把批次数据塞进了列表,而不是单个样本。第二步:扁平化你的输入数据
如果Images是由多个批次数组组成的列表,先把它们拼接成一个包含所有单个样本的大数组:import numpy as np # 拼接后得到形状为(N, 299, 299, 3)的数组,N是总样本数 Images = np.concatenate(Images, axis=0)要是
Images是嵌套列表(比如每个子列表是一个批次的样本),那你需要把它展开成单个样本的列表,确保每个元素都是(299,299,3)的单个样本张量/数组。第三步:正确调用tf.train.batch
确保传入的是包含所有样本的张量,而不是批次列表。示例代码如下:# 先把numpy数组转成TensorFlow张量 images_tensor = tf.convert_to_tensor(Images, dtype=tf.float32) targets_tensor = tf.convert_to_tensor(targets, dtype=tf.float32) # 生成预期的批次,batch_size设为8 batch_images, batch_targets = tf.train.batch( [images_tensor, targets_tensor], batch_size=8, num_threads=4, # 根据你的CPU核心数调整 capacity=1000 # 队列容量,按需设置 )这样生成的
batch_images形状就是(8,299,299,3),batch_targets是(8,120),完全符合你的预期。
简单总结下:tf.train.batch的输入要求是单个样本组成的张量/数组,而不是批次组成的列表。只要把输入数据调整成单样本级别的集合,多余的维度就会消失啦!
内容的提问来源于stack exchange,提问作者Ashutosh Sancheti
相关产品推荐
相关产品推荐

