1.tf.split和tf.unstack()
tf.split(value,num_or_size_splits,axis=0,num=None,name=’split’)
函数参数:
value: 要分割的 Tensor。
num_or_size_splits: 指示沿 split_dim 分割数量的 0-D 整数 Tensor 或包含沿split_dim 每个输出张量大小的 1-D 整数 Tensor ;如果为一个标量,那么它必须均匀分割 value.shape[axis];否则沿分割维度的大小总和必须与该 value 相匹配。
axis:A 0-D int32 Tensor; 表示分割的尺寸;必须在[-rank(value), rank(value))范围内;默认为0。
num: 可选的,用于指定无法从 size_splits 的形状推断出的输出数。
name: 操作的名称(可选)。
函数返回值:
如果 num_or_size_splits 是标量,返回 num_or_size_splits Tensor对象
如果 num_or_size_splits 是一维张量,则返回由 value 分割产生的
num_or_size_splits.get_shape[0] Tensor对象
import tensorflow as tf
A = [[1, 2, 3], [4, 5, 6]]
a0 = tf.split(A, num_or_size_splits=3, axis=1)
a1 = tf.unstack(A, num=3,axis=1)
a2 = tf.split(A, num_or_size_splits=2, axis=0)
a3 = tf.unstack(A, num=2,axis=0)
with tf.Session() as sess:
print(sess.run(a0))
print(sess.run(a1))
print(sess.run(a2))
print(sess.run(a3))
返回结果:
[array([[1],[4]]), array([[2], [5]]), array([[3],[6]])]
[array([1, 4]), array([2, 5]), array([3, 6])]
[array([[1, 2, 3]]), array([[4, 5, 6]])]
[array([1, 2, 3]), array([4, 5, 6])]
2.tf.train.batch()和tf.train.shuffle_batch()
返回值都是一个batch的样本和样本标签,前者按照顺序,后者是随机的。
(1)tf.train.batch([example, label], batch_size=batch_size, capacity=capacity)
[example, label] – 样本和标签,可以是单个样本和单个标签
batch_size – 返回的一个 batch 的样本数.
capacity – 队列容量. 按顺序组合成一个batch.
tf.train.batch(tensors,
batch_size,
num_threads=1,
capacity=32,
enqueue_many=False,
shapes=None,
dynamic_pad=False,
allow_smaller_final_batch=False,
shared_name=None,
name=None )
参数:
tensors – 送入队列的 tensors 列表或字典. tf.train.batch 函数返回值是相同类型的 tensors.
batch_size – 从队列拉取的样本的 batch size
num_threads – 入队 tensors 的线程数. 如果 num_thread>1,则 batch 操作是非确定的.
capacity – 整数,队列容量,队列里样本元素的最大数.
enqueue_many – tensors 内的每个 tensor 是否是单个样本.
shapes – (可选)每个样本的 shape. 默认是 tensors 的shapes.
dynamic_pad – Boolean 值. 输入 shapes 的变量维度. 出队后会自动填补维度,以保持batch内 shapes 一致.
allow_smaller_final_batch – (可选) Boolean 值. 如果队列中样本不足 batch,允许最后的 batch 样本数小于 batch_size.
shard_name – (可选). 如果设置了该参数,则在多个会话给定的名字时,共享队列.
name – (可选). 操作operations 的名字.
简单说明:
1.该函数的输入 tensors 是张量tensors列表或字典,且函数返回相同类型的 tensors.
2.该函数采用队列queue 来实现. 队列的 QueueRunner 被添加到当前 Grahp 的 QUEUE_RUNNER 集合(collection) 中.
3.如果 enqueue_many=False,则 tensors 表示单个样本.
对于 shape 为 [x, y, z] 的输入 tensor,该函数输出为,shape 为 [batch_size, x, y, z] 的 tensor.
如果 enqueue_many=True,则 tensors 表示 batch 个样本,其中,第一维表示样本的索引,所有的 tensors 都在第一维具有相同的尺寸.
对于 shape 为 [*, x, y, z] 的输入 tensor,该函数输出为,shape 为 [batch_size, x, y, z] 的 tensor.
4.capacity 参数控制着预取队列的长度(how long the prefetching is allowed to grow the queues),队列容量.如果输入队列用完,则返回 tf.errors.OutofRangeError.
5.如果 dynamic_pad=False,则必须保证 shapes 参数被传递,或 tensors 内的所有张量必须已经预定义 shapes. 否则,会出现 ValueError.
如果 dynamic_pad=True,则张量的秩已知即可,但独立维度的 shape 为 None. 此时,每次入队时,维度为 None 的值的长度是可变的. 出队后,输出的 tensors 会根据当前 minibatch 内的 tensors 的最大 shape 来在右边自动补零. 对于数字 tensors,填补的值为 0;对于字符串 tensors,填补的是空字符. 可见 PaddingFIF0Queue.
6.如果 allow_smaller_final_batch=True,当队列关闭时,如果没有足够的样本元素来填补 batch,则会返回比 batch_size 更小的 batch 值,否则会丢弃样本元素.
(2) tf.train.shuffle_batch([example, label], batch_size=batch_size, capacity=capacity, min_after_dequeue)。这里面的参数和上面的一样的意思。不一样的是这个参数min_after_dequeue,一定要保证这参数小于capacity参数的值,否则会出错。这个代表队列中的元素大于它的时候就输出乱的顺序的batch。也就是说这个函数的输出结果是一个乱序的样本排列的batch,不是按照顺序排列的。min_after_dequeue越大,数据越乱
3.tf.train.slice_input_producer
是一个tensor生成器,作用是按照设定,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入文件名队列
slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None,
capacity=32, shared_name=None, name=None)
tf.train.slice_input_producer([image,label],num_epochs=10),随机产生一个图片和标签,num_epochs=10,则表示把所有的数据过10遍,使用完所有的图片数据为一个epoch,这是重复使用10次。上面的用法表示你的数据集和标签已经全部加载到内存中了,如果数据集非常庞大,我们通过这个函数也可以只加载图片的路径,放入图片的path,注意path必须是一个list或者tensorlist.
第一个参数 tensor_list:包含一系列tensor的列表,表中tensor的第一维度的值必须相等,即个数必须相等,有多少个图像,就应该有多少个对应的标签。
第二个参数num_epochs: 可选参数,是一个整数值,代表迭代的次数,如果设置 num_epochs=None,生成器可以无限次遍历tensor列表,如果设置为 num_epochs=N,生成器只能遍历tensor列表N次。
第三个参数shuffle: bool类型,设置是否打乱样本的顺序。一般情况下,如果shuffle=True,生成的样本顺序就被打乱了,在批处理的时候不需要再次打乱样本,使用 tf.train.batch函数就可以了;如果shuffle=False,就需要在批处理时候使用 tf.train.shuffle_batch函数打乱样本。
第四个参数seed: 可选的整数,是生成随机数的种子,在第三个参数设置为shuffle=True的情况下才有用。
第五个参数capacity:设置tensor列表的容量。
第六个参数shared_name:可选参数,如果设置一个‘shared_name’,则在不同的上下文环境(Session)中可以通过这个名字共享生成的tensor。
第七个参数name:可选,设置操作的名称。
tf.train.slice_input_producer定义了样本放入文件名队列的方式,包括迭代次数,是否乱序等,要真正将文件放入文件名队列,还需要调用tf.train.start_queue_runners 函数来启动执行文件名队列填充的线程,之后计算单元才可以把数据读出来,否则文件名队列为空的,计算单元就会处于一直等待状态,导致系统阻塞。