我有一个图像列表(尝试使用自定义图像训练CNN模型),通过以下方式定义和重塑:
reader.images = tf.reshape(self.images, [-1, 256, 256, 3])
哪个印刷品:
reader.Images :
[[[[ 127. 255. 127.]
[ 140. 255. 114.]
[ 217. 255. 38.]
...,
[[ 255. 240. 0.]
[ 255. 241. 0.]
[ 249. 246. 6.]
...,
[ 203. 237. 52.]
[ 152. 251. 102.]
[ 143. 253. 111.]]
[[ 255. 184. 0.]
[ 248. 192. 7.]
[ 205. 242. 50.]
...,
[ 255. 139. 0.]
[ 255. 171. 0.]
[ 255. 177. 0.]]
[[ 255. 178. 0.]
[ 237. 187. 18.]
[ 131. 240. 124.]
...,
[ 255. 123. 0.]
[ 255. 156. 0.]
[ 255. 162. 0.]]]]
我想训练我的模型,每次迭代提取一批。但是当我使用时:
image_batch = tf.train.batch(
[reader.images], batch_size=batch_size, dynamic_pad=True)
与batch_size =1
我将整个图像作为输出(与上面打印的整个列表图像相同)。我是Tensorflow的新手,所以欢迎任何提示。
对于你要求的,你应该添加enqueue_many=True
。
tf.train.batch
通常用于从单个项目张量创建批处理,该批处理来自例如队列。
所以你可能会用图像张量([256,256,3])来提供它并获得批量张量([batch_size,256,256,3])。
它通常不用于从列表张量中分割批次。如果你以这种方式使用它,你必须将所有图像加载到内存中,这样的扩展性不是很高。
这至少是默认值,enqueue_many=False
:
如果enqueue_many为False,则假定张量代表单个示例。具有形状[x,y,z]的输入张量将作为具有形状[batch_size,x,y,z]的张量输出。
如果你真的想将所有图像加载到内存中,你可以将enqueue_many=True
添加到tf.train.batch
调用中。
如果enqueue_many为True,则假定张量代表一批示例,其中第一维以示例为索引,并且张量的所有成员在第一维中应具有相同的大小。如果输入张量具有形状[*,x,y,z],则输出将具有形状[batch_size,x,y,z]。 capacity参数控制允许预取的时间长度。
我建议阅读https://www.tensorflow.org/programmers_guide/datasets以获得进一步的指导(现在记录使用数据集而不是之前推荐的队列的新推荐方法 - 您可以直接从数据集创建批处理而不是调用tf.train.batch)。