原理
tensorflow使用双队列“文件名队列+内存队列”的形式读入文件,可以很好的管理epoch。
文件名队列使用tf.train.string_input_producer()建立 内存队列不需要自己建立,使用reader对象在文件名队列中读取数据即可。
介绍相关函数
tf.train.string_input_producer()
参数详情:
- string_tensor:输入的文件名列表
- num_epochs:周期,对于一个数据集来讲,运行一个epoch就是将这个数据集中的图片全都计算一遍。
- shuffle:是指在一个epoch内的文件的顺序是否被打乱,若设置为False,则不打乱顺序,若为True,则打乱顺序
tf.train.start_queue_runners()
在使用上述函数之后,整个系统还是处于停滞状态,也就是说,文件名并没有被真正加入到队列中,而使用tf.train.start_queue_runners()函数后,才会启动填充队列的进程,此时系统不再停滞。
tf.WholeFileReader()
将文件的全部内容作为值输出的Reader.
如果要使用,请在队列(Queue)中的排列文件名.Read的输出将是一个文件名(key)和该文件的内容(value)
- return: 读取器实例
- read(file_queue):输出将是一个文件名(key)和该文件的内容(value)
tf.image.decode_jpeg(contents)
将reader中读取的jpeg编码的图像解码为uint8张量。
return一个uint8张量,为[height, width, channels]形状
tf.image.decode_png(contents)
将png编码的图像解码为uint8或者uint16张量
return同上
tf.image.resize_image(images, size)
缩放图片,并不是截取
- images:4-D形状或者3-D形状
- size:1-D int32张量,图像的新尺寸
- 返回相同格式的新图片
附上代码运行实例
import tensorflow as tf
with tf.Session() as sess:
try:
filename = ['A.jpg', 'B.jpg']
filename_queue = tf.train.string_input_producer(filename, num_epochs=1, shuffle=False)
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
image = tf.image.decode_jpeg(value)
sess.run(tf.local_variables_initializer())
threads = tf.train.start_queue_runners(sess=sess)
i = 0
while True:
i += 1
image_data = sess.run(image)
print(image_data.shape)
except:
print("have been overed")
数据增强的原理
深度学习通常会要求拥有重组数量的训练样本,一般来说,数据的总量越多,训练得到的模型效果就会越好。 在图像任务中,通常会观察到这样一种现象:对输入的图像进行一些简单的平移,缩放,颜色变换,并不会影响图像的类别。 故对于图像类型的训练数据,所谓的数据增强方法是指利用平移,缩放,颜色等变换,人工增大训练集样本的个数,从而获得更充足的训练数据,使模型训练的效果更好。
使用数据增强方法的前提是:数据增强方法不会改变图像的原有标签
通常数据增强的方法如下:
- 平移
- 旋转
- 翻转
- 裁剪
- 缩放
- 颜色变动:对图像的RGB颜色空间进行一些变换
- 噪声扰动:给图像加入一些人工生成的噪声
使用数据增强或可提高模型的泛化能力,并且能够预防过拟合。
数据增强的一些简单函数
tf.random_crop(value, size, seed=None, name=None)
随机的将张量裁剪为给定的大小
- value 向裁剪输入张量
- size 一维张量
- seed 用于创建一个随机的种子
- 返回 与 value 具有相同的秩并且与 size 具有相同形状的裁剪张量.
tf.image.random_flip_left_right(image, seed=None)
以0.5的概率按水平从左向右随机翻转图像
tf.image.random_brightness(image, max_delta, seed=None)
随即调整图像的亮度
- image:图像
- max_delta:float不能为负,亮度为[-max_delta, max_delta)中随机选取的
tf.image.random_contrast(image, lower, upper, seed=None)
随机调整对比度
- image:图像
- lower:浮点型,随机对比因子下限
- upper:浮点型,随即对比因子上限