文章原稿 在石墨笔记, 如下
https://shimo.im/docs/DR5Sm1BkTjI8iAfx/
这里读的是tensorflow 的官方代码, 链接如下
https://www.tensorflow.org/tutorials/recurrent#language_modeling
官网的例子 很简洁, 还是看看具体代码并坐笔记来的扎实
看代码的逻辑大概是 input , model, train
输入数据集准备
Input, data preparation
数据的输入来自456 行(ptb_word_lm.py)
raw_data = reader.ptb_raw_data(FLAGS.data_path)
这就需要读一下ptb 里的reader.py 文件
首先看 ptb_raw_data (line 55), 这个函数, 注释说Reads PTB text files, converts strings to integer ids and performs mini-batching of the inputs. 这里调用了四个函数
第 78行的函数用了一个小技巧, 具体如下
这里边的sorted, 用的很巧妙, 这个函数默认从小到大 排序, 但是我们需要从大到小, 所以就用了key, 去排序, 排序的原则是(-x[1], x[0]), 其中x[1] 是dictionary value, 就是单词出现的个数, x[0] 是对应的单词
关于input data 的另一个要点就是 iterate, 这里定义的是ptb_producer, 不过这个相对比较简单, 就是随机 从数据集里拿数据, 几个tensorflow 的函数需要注意。
还有一点关于数据输入的, ptb producer
可以参考的博客有
https://blog.csdn.net/liyuan123zhouhui/article/details/70169806
模型
今天今天看了这个博客, 感觉写的很不错,
https://blog.csdn.net/a343902152/article/details/54429096今天看了这个博客, 感觉写的很不错,
1. 这个就是PTBModel 的类别, 一开始定义初始化, 非常通俗移动, 第127 行 随机生成了embedding matrix, 然后这个矩阵被用来去代表每个word, 通过look up table at 129
2. 这里也很简单 调用了一个 graph 然后还定义了 loss
这里需要注意134行, 这里是用来做RNN graph 的
这个graph 的建立 也很简单, 官网 本来还 有 GPU CUDNN的版本,大同小异, 就先关注这个
这里用了tensorflow 自带的 lstm_cell, 用的是tf.contrib.rnn.BasicLSTMCell
代码读到这里, 我发现两个函数我不理解, 第一 就是export_ops, 第二个就是 import ops
谷歌了一段时间, 这个有关graph collection
https://www.tensorflow.org/programmers_guide/graphs
基本的目的就是给这些跟训练有关的参数 设计一个新名字, 这样, 测试模型就不需要那训练模型中跟训练有关的参数了。
训练
到这里, 就要看看训练过程了,
这里先是 建立了一个graph, , 在这个graph 下,调用了训练模型, 测试模型和验证模型 会有variable reuse. 接着在488 行, 建立了一个dictionary, 然后输出了和训练相关的变量, 主要就是为了改名字
这个截图就是训练过程了, 模型就是m, mvalid, 还有m train.
这里少了一个run epoch
这个run_epoch 在这篇博客里有介绍
https://blog.csdn.net/diligent_321/article/details/53385508
这里边的model.init_state 的定义如下
就是记录了LSTM 的 c, h 的状态, 其中的语句, state=session.run(model.initial_state) 是为了在每一次新的 epoch, 都可以使用上个epoch 的lstm state 的状态. 否则每次新的epoch , LSTM 的状态都是从0 开始的啦。
关于LSTM state 的使用, 也可以参考这个
https://github.com/tensorflow/tensorflow/issues/2695
答疑解惑
这里呢, 容易对 batch 和 step_size 进行混淆, batch size 是指 一次输入多少个数据, 而step size 是用来考虑 算differentiation.
https://stackoverflow.com/questions/44381450/doubts-regarding-batch-size-and-time-steps-in-rnn#