开始入门深度学习,在手推了RNN和LSTM的BP算法后(参考paper:Supervised Sequence Labelling with Recurrent Neural)。开始尝试用tensorflow实现RNN和LSTM以及基于其的一些衍生模型,在实现的过程中有一些思考和未解决的问题,在这里一并记录。
变量解释
本文的实现主要是依据这篇博客, 开篇作者便引入了五个变量:
num_steps = 5
batch_size = 200
num_classes = 2
state_size = 8
learning_rate = 0.1
num_epochs = 1
这里有必要先解释一下这些变量的含义,但是读者们大概率觉得枯燥,可以大致浏览下然后往下看,中途多次回顾即可。第一个变量num_steps,RNN循环的次数,由此可见深入理解这个变量对于理解代码所实现的RNN网络拓扑和RNN网络至关重要。第二个变量batch_size指的是批的大小,这个可以自己指定;num_classes是数字的类别,这里为2也即是0和1;state_size指隐藏层的神经元个数在图中是S内部的神经元数目;下一个是学习率,这个是应用于Adagrad算法的;最后一个是网络执行的次数。
先看原博客中给出的RNN结构图
这个图比较笼统,不易观察出batch_size、state_size等变量的对应关系,因此,我找到了第二张RNN结构图
我对这两张图的理解是:第一张图的P和第二张中的y是输出层,所不同的是第一张把真正的输出y进行了softmax处理得到了P;第一张的S和第二张的h都是隐藏层,其中上图的每一个S对应的下图三个小h(这里的“三个”在代码中用变量state_size表示);上图的X和下图的x都是输入层。
到此为止都比较宏观,读者可以在阅读代码时想一想开篇这一节所说的概念。
数据处理
def gen_data(size=1000000):
X = np.array(np.random.choice(2, size=(size, )))
Y = []
for i