第一步:读入数据
import tensorflow as tf
import numpy as np
import os
import matplotlib.pyplot as plt
import pdb
def get_files(file_dir):
img=[]
label=[]
for file in os.listdir(file_dir):
img.append(file_dir+file)
label.append(1)
temp=np.array([img,label]).T
#使用shuffle打乱顺序
np.random.shuffle(temp)
img_list=list(temp[:,0])
label_list=list(temp[:,1])
label_list=[int(i) for i in label_list]
return img_list,label_list
第二步:将上述的list产生训练的批次
tensorflow为了充分利用CPU和GPU,减少CPU或者GPU等待数据的空闲时间,使用两个线程分别执行数据的读入和数据的计算。即用一个线程源源不断地从硬盘中读取图像数据到内存队列,另一个线程负责计算任务,所需的数据直接从内存队列中获取。tensorflow在内存队列之前还设置了文件名队列,文件名队列存放参与训练的文件名,要训练N个epoch,则文件名队列中就含有N个批次的所有文件名,如图所示。
在N个epoch的文件名后是一个结束标志,当tensorflow捕捉到结束标志时会抛出一个OutofRange的异常,外部捕捉到这个异常后就结束程序。
input_queue=tf.train.slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None, capacity=32, shared_name=None,name=None)是一个tensor生成器,每次从一个tensor列表中抽取一个tensor放入文件名队列。需要调用tf.train.start_queue_runners启动执行文件名队列填充的线程,之和计算单元才会把数据读出来,否则文件名队列是空的,计算单元会一直处于等待状态
tensor_list: 输入,有多少图像该参数第一维就有多少;若tensor_list=[image,label],则input_queue[1]代表标签,input_quue[0]代表图像,需要通过tf.read_file(input_queue[0])输出图像
num_epochs: 迭代次数,设置为None代表可以无限次地遍历tensor列表,若设置为N,则只能遍历N次;
shuffle: 是否打乱样本的顺序;
seed: 生成随机数的种子,在shuffle为True时才有用;
capacity: 代表tensor列表容量
shared_name: 如果设置一个shared_name,可在不同的Session中可通过这个名字共享生成的tensor;
name: 设置操作的名字
tf.train.batch(tensors, batch_size, num_threads=1, capacity=32, ...)
tf.train.shuffle_batch(tensors, batch_size, num_threads=1, capacity=32, min_after_dequeue,...)
这两个函数用来生成批次数据
则生成批次数据code如下:
def get_batch(image,label,batch_size):
image_W=200
image_H=200
#将python中的list类型转换为tf能识别的格式
image=tf.cast(image,tf.string)
label=tf.cast(label,tf.int32)
#产生一个输入队列queue
epoch_num=50
input_queue=tf.train.slice_input_producer([image,label],num_epochs=epoch_num)
label=input_queue[1]
image_contents=tf.read_file(input_queue[0])