tensorflow batch函数实现

def get_batch(image, label, image_W, image_H, batch_size, capacity):
    
    image = tf.cast(image, tf.string)
    label = tf.cast(label, tf.int32)
    #生成列队
    input_queue = tf.train.slice_input_producer([image, label])
    
    label = input_queue[1]
    image_contents = tf.read_file(input_queue[0])
    image = tf.image.decode_jpeg(image_contents, channels=3)
    
    image = tf.image.resize_image_with_crop_or_pad(image, image_W, image_H)
    a = tf.reduce_mean(image)
    image = tf.subtract(image,a)
    
    image_batch, label_batch = tf.train.batch([image, label],
                                              batch_size= batch_size,
                                              num_threads= 16, 
                                              capacity = capacity)
 
    
    label_batch = tf.reshape(label_batch, [batch_size])
    image_batch = tf.cast(image_batch, tf.float32)
    
    return image_batch, label_batch
    sess.run(tf.global_variables_initializer())
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    
    try:
        for step in np.arange(MAX_STEP):
            if coord.should_stop():
                    break
            ………………
            ………………
            ………………
    finally:
        # 使用tf.train.Coordinator来停止所有线程  
        coord.request_stop()
     
    coord.join(threads)
    sess.close()

 tensorflow数据的读取形式:

使用一个线程将硬盘中的图片数据读入到一个队列中,另一个线程负责计算任务,所需数据直接从该队列中获取。

存入列队的函数:

input_queue = tf.train.slice_input_producer(tensor_list, num_epochs=None, shuffle=True,seed=None,
                                capacity=capacity, shared_name=None, name=None)
'''
tensor_list:输入的tensor列表

num_epochs:可选参数,是一个整数值,代表迭代的次数,如果设置None,生成器可以无限次遍历tensor列表,如果设置为 num_epochs=N,生成器只能遍历tensor列表N次。

shuffle:bool类型,设置是否打乱样本的顺序

seed:可选的整数,是生成随机数的种子

capacity:设置tensor列表的容量

share_name:可选参数,如果设置一个‘shared_name’,则在不同的上下文环境(Session)中可以通过这个名字共享生成的tensor

name:操作的名称
'''

 

在得到列队后,再调用tf.train.start_queue_runners 函数来启动执行文件名队列填充的线程,之后计算单元才可以把数据读出来。

但在此之前,需要先调用 tf.train.Coordinator() 来创建一个线程协调器,用来管理之后在Session中启动的所有线程。

tf.train.start_queue_runners()

启动入队线程,这之后才能读取数据到用于之后的计算。

image_batch, label_batch = tf.train.batch(tensors, batch_size, num_threads=1,
                                         capacity=capacity,enqueue_many=False, shapes=None,
                            dynamic_pad=False,allow_smaller_final_batch=False, 
                            shared_name=None, name=None)
'''
tensors:tensor序列或tensor字典,可以是含有单个样本的序列
batch_size: 生成的batch的大小
num_threads:执行tensor入队操作的线程数量,可以设置使用多个线程同时并行执行
capacity: 定义生成的tensor序列的最大容量
enqueue_many: 定义第一个传入参数tensors是多个tensor组成的序列,还是单个tensor
shapes: 可选参数,默认是推测出的传入的tensor的形状
dynamic_pad: 定义是否允许输入的tensors具有不同的形状,设置为True,会把输入的具有不同形状的tensor归一化到相同的形状
allow_smaller_final_batch: 设置为True,表示在tensor队列中剩下的tensor数量不够一个batch_size的情况下,允许最后一个batch的数量少于batch_size, 设置为False,则不管什么情况下,生成的batch都拥有batch_size个样本
shared_name: 可选参数,设置生成的tensor序列在不同的Session中的共享名称
name: 操作的名称
'''

如果tf.train.batch的第一个参数 tensors 传入的是tenor列表或者字典,返回的是tensor列表或字典,如果传入的是只含有一个元素的列表,返回的是单个的tensor,而不是一个列表。

猜你喜欢

转载自blog.csdn.net/i96jie/article/details/82464873