21个项目玩转深度学习 学习笔记(2)

Tensorflow中数据读取的基本机制。

事实上,必须先读入数据后才能进行计算,假设读入用时0.1s,计算用时0.9秒,那么没过1s,GPU都会有0.1s无事可做,大大降低了运算的效率。

解决这个问题的方法将读入数据和计算分别放在两个线程中,读取线程不断地将文件系统中的图片读入一个内存的队列中,而负责计算的是另一个线程,计算需要数据时,直接从内存队列中读取就可以了。这样可以解决GPU因为I/O而空闲的问题。

在Tensorflow中,为了方便管理,在内存队列前又添加了一层所谓的“文件名队列”

机器学习中一个概念是epoch,对于一个数据集来讲,运行一个epoch就是将这个数据集中的图片全部计算一遍。如果一个数据集中有三张图片A.JPG、B.JPG、C.JPG,那么对运行一个epoch就是指对A、B、C三张图片都计算一遍。两个epoch就是指先对A、B、C各计算一遍,然后再全部计算一遍,也就是说每张图片都计算了两遍。

Tensorflow使用“文件名队列+内存队列”双队列的形式读入文件,可以很好地管理epoch。假定要运行一个epoch,那么在文件名队列中把A、B、C各放入一次,在之后标注队列结束。程序运行后,内存队列依次读入A、B、C,再尝试读入,就检测到了结束,自动抛出一个异常,结束程序。这是Tensorflow种读取数据的基本机制。如果要运行2个epoch而不是1个epoch,在文件名队列中将A、B、C依次放入两次再标记结束就可以了。

对于文件名队列,使用tf.train.string_input_producer函数,这个函数需要传入一个文件名list,系统会自动将它转为一个文件名队列。

此外,tf.train.string_input_producer还有两个重要参数,一个是num_epochs,它就是之前提到的epoch数,另外一个shuffle,shuffle是指在一个epoch内文件的顺序是否被打乱,若设置shuffle=False,每个epoch中数据仍然按照A、B、C的顺序进入文件名队列。如果设置shuffle=True,那么在一个epoch内,数据的前后顺序就会被打乱。

在Tensorflow中,内存队列不需要自己建立,只需要使用reader对象从文件名队列中读取数据就可以了。

还有另一个函数tf.train.start_queue_runners。在使用tf.train.string_input_prodecer创建文件名队列后,整个系统其实还处于停滞状态,也就是说文件名并没有真正被加入队列中,如果此时开始计算,因为内存队列中什么也没有,计算单元就会一直等待,导致整个系统被阻塞。

使用tf.train.start_queue_runners之后,才会启动填充队列的线程,这时系统就不会再停滞了。此后,计算单元就可以拿到数据并进行计算,整个程序运行起来。

数据增强

深度学习通常会要求拥有充足数量的训练样本,一般来说,数据的总量越多,训练得到的模型效果会越好。

对于图像类型的训练数据,所谓的数据增强(Data Augmentation)方法是指利用平移、缩放、颜色等变换,人工增大训练集样本的个数,从而获得更充足的训练数据,使得模型训练的效果更好。

常见的图像数据增强的方法如下:

  • 平移:将图像在一定尺度范围内平移
  • 旋转:将图像在一定角度范围内旋转
  • 翻转:水平翻转或者上下翻转图像
  • 裁剪:在原有图像上裁剪出一块
  • 缩放:将图像在一定尺度内放大或缩小
  • 颜色变换:对图像的RGB颜色空间进行一些变换
  • 噪声扰动:给图像加入一些人工生成的噪声

使用数据增强的方法的前提是,这些数据增强方法不会改变图像的原有标签。

在训练的时候,常常想知道损失的变化,以及各层的训练状况。Tensorflow提供了一个可视化工具TensorBoard可以非常方便地观察损失的变化曲线,还可以观察训练速度等其他日志信息,达到实时监控训练过程的目的。

深度残差模型的优势在于使用了跳过链接,让神经网络从拟合F(x)变成拟合F(x)-x。残差比原始函数更容易学习,也更适合深层模型迭代,因此,即使训练非常深的神经网络也不会发生非常严重的过拟合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值