上周学习任务没有完成,这周终于完成了。主要的内容有:
- 重新学习了使用TFRecord、多线程输入数据处理
- 看了tensorflow官网的Importing Data教程,使用更高级的组合数据集
- 看了im2txt的源码,知道了Image caption的实现原理
- 开始了年终项目(比赛项目),做了数据处理部分
一、重新学习了使用TFRecord、多线程输入数据处理
几个月前,看了《TensorFlow实战Google深度学习框架》这本书,然后懵懵懂懂做了一个图片识别的小东西。当时,仿照书上是将图片和label使用TFRecord格式进行存储,然后使用多线程与队列的形式组合数据。
当时不知道为什么这么做,现在明白了。给数据的方式有多种:
- 1、可以直接读取数据到内存中,然后将数据分成一个个batch,给模型进行训练。这种方式读取适合数据量少的情况,如果对大数据量来的话,内存之中会存储多份这样数据,从而导致占用大量内存。我现在就碰到过,读取一个6G的文件到内存中,因为中途需要对数据进行处理,从而导致数据存储几份,直接就导致机器卡死。
- 2、使用队列和多线程的形式进行读取,然后使用多线程组合batch。这种方式适合大量数据读取,而且效率特别高。在整个读取过程,我们可以控制输入队列的capacity,例如我们设置capacity为10000,当队列中的数据量少于10000的时候,输入队列就会启动多个线程从数据源读取数据到队列中;而当队列中的数据量等于10000时,输入队列将只进行出队,不进行入队。这样,既保证了模型有数据可用,又控制了数据量。当然,这个只是队列读取数据,我们还可以使用tf.train.batch来进行数据组合,每次都会取设置batch_size个数据。当然,TFRecord是官方建议的数据格式,它操作起来更方便。
二、看了tensorflow官网的Importing Data教程,使用更高级的组合数据集
在重新学习了上面的内容之后,不经意间发现了Importing Data,然后发现官网将读取数据和组合数据封装的更简单了。
它整个流程特别简单:
- 1、定义数据源,它有三种方式:直接从内存中读取,例如可以使用tf.contrib.data.Dataset.range()或tf.contrib.data.Dataset.from_tensor_slices()等方法;使用tf.contrib.data.TFRecordDataset()从TFRecord文件格式读取;使用tf.contrib.data.TextLineDataset()从文件中一行一行读取。
- 2、使用Dataset.map()方法对数据进行预处理,这个方法传递一个函数作为参数,然后通过这个函数来进行数据处理
- 3、构建生成器,可以使用make_one_shot_iterator()创建,当然也有其它API。
- 4、通过Dataset.batch()组合成Batch数据,还可以通过Dataset.repeat()来进行设置可以重复多少个Epochs
三、看了img2txt的源码,知道了Image caption的实现原理
星期天下午的时候,看了im2text模型的代码,发现实现起来比NMT简单多了。
它实现的原理主要参考是来自下图的模型:
它首先通过Inception v3
模型对图片进行特征读取,然后再加上一个全连接层,从而对图片进行embedding了。
然后,将图片Embeddings给LSTM,才知道原来这里只使用了一层RNN。
最后,解码层其实就和seq2seq差不多了。
四、开始了年终项目(比赛项目),做了数据处理部分
主要是看了项目的数据是怎么样的,然后将一份数据拆成5份,然后将里面对图片的描述变成id。
进度还不怎么样,在处理TFRecord数据时出现了问题。
总结与计划
总结:主要对队列与多线程读取、组合数据有更深刻的印象,然后可以将公司的代码改下,会有更好的性能。
计划:将年终项目的代码写完,然后开始跑模型。