Tensorflow数据读取机制及数据增强机制

原理

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:浮点型,随即对比因子上限

发布了267 篇原创文章 · 获赞 51 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/AcSuccess/article/details/89365462