Some Notes
本笔记是对Google开源的Show-and-Tell代码的学习的一些笔记,并对TensorFlow的一些用法以及训练方法的整理。
输入
读取数据到数据队列当中。在输入数据很大的情况下,实际上只要构建出合理的输入队列,我们就可以不用去操心数据读入的事情。TensorFlow支持多种的数据读入方式,一种比较简单的方式是使用placeholder,但是这需要在使用的过程中feed_data,并不适合大量数据的读入。另一种方式是使用二进制文件和输入队列的组合形式。
二进制文件,在代码中有一个独立于训练之外的代码,需要训练之前去生成的,生成TFRecord file,这样的话在训练的时候就可以使用TFRecordReader就可以读取该文件。
- pattern->文件名队列data_files
- tf.train.string_input_producer->filename_queue,这里可以设置shuffle=True均匀打乱文件名
- Reader读取文件得到数据,存储到values_queue
- tf.train.batch_join,从values_queue中读取到足够多的数据,生成batch数据
LSTM部分
先讲讲代码中的lstm的操作
- 构建lstm_cell
- 构建零状态,设置batch_size
- 将image embedding作为输入,得到初始状态(这时有一个初始输出,没有什么用,或者默认第一个输出为BOS)
- 在构建输入输出的时候有一个input_seqs,实际上为完整的句子去掉最后一个单词,然后利用下面的函数
1
2
3
4
5
6
lstm_outputs, _ = tf.nn.dynamic_rnn(cell=lstm_cell,
inputs=self.seq_embeddings,
sequence_length=sequence_length,
initial_state=initial_state,
dtype=tf.float32,
scope=lstm_scope)
实验
有以下问题
- 做sequence embedding,我看文章中是用LSTM做的,但是没有找到相关方法,我个人的想法是,lstm的初始输入为全零,但是每次将单词输入进去,然后将最后的输出作为sequence,不知道这个方法可行不?
- 生成模型一遍train,一遍inference