文章目录
本文的主要内容是对于参数的理解和我在学习过程中遇到的问题,在自己实践的情况下得到的解决,都是基础问题,已经了解的大佬可以选择跳过
简单理解RNN和LSTM
循环神经网络的经典,对于各种框架都有现成的函数支持,接下来我们对于RNN和LSTM做一个简单的了解(这不是咱们这部分的主要内容,如果想要细致了解原理请移步其它老师作品
RNN与LSTM基础(不会具体讲解)
RNN
首先简单了解下循环神经网络,实际上本质就是普通的神经网络加了一层隐藏层中的循环,简单放个图
中间红色的部分就是RNN和普通神经网络的区别,可能通过这个图片不是很好理解哈,没关系,咱们再放一个好理解的图
(我这里画的是一个输入和一个输出,实际上可以有多个输出)
红色部分就是和普通神经网络的差别,也就是上一个神经元的输出,不仅仅是到输出层,还作为下一个神经元的输入!
lstm
lstm主要通过对于四个门的特定设置,适当地对于前一个神经元的输出选择性输入,对于自身的状态也选择性更新,输出也选择性输出,简单来说就是升级版的RNN
RNN和LSTM能做什么?
能做的事情其实很多,我在这里介绍的主要是两个,一个是文本序列,一个是时间序列
why文本?
以RNN为例子
我们分别输入’I’,‘love’,‘playing’,‘computer’,想要输出’Game’。对于普通的神经网络来说会很困难,但是循环神经网络的话,它中间的特殊结构导致了它可以和上下文相联系(即设置权重什么的),因此可以较好地预测最后的单词是什么
但是其实RNN的输出是这样的(下图为比较正确的输出):
每一次都预测出下一个词是什么,然后我们取最后一次的作为输出,RNN可以设置单向还是双向,因此在训练的时候就能做到这一点
why时间序列?
这个更简单,比如说我们有一个sinx图像,我们给出了一小段的趋势,想预测后面的图像如何,这样子前后的数值影响一定有关系,所以使用RNN一类的循环神经网络的话就有效果
本文重点(RNN和LSTM大多数参数都一致,改个名字即可):
1.如何对照着理解文本和时间序列?
- 文本序列中的句子对应着时间序列的一条时间线
- 文本序列中的句子的词数量对应着时间序列的一条时间线中的时间节点数量
- 文本序列中的每个单词的维度对应着时间序列的一个节点由多少个特征控制
我个人觉得前两条还是蛮好理解的,第三条我简单说明一下,每个单词的维度的意思就是,如果对单词进行独热编码之后,整个独热编码的长度
举个例子:
I love playing computer games,一共有五个单词,那么维度就是五
如果我输入’I’,得到的就是[1,0,0,0,0]
如果我输入的是’computer’,得到的就是[0,0,0,1,0]
而每个时间节点由多少个特征控制则是:
如果说我想输入航空公司前十天的数据,预测第十一天的人流量
其中可以输入的数据分别是:当天收入,当天男女比例,当天飞机起飞次数
那么我们时间节点就是由3个特征控制的,维度就是3
2.keras中参数的理解
参数很多,想要了解的同学可以自行了解,但是我在这里只简单介绍几个选项
units神经元的个数
activation激活函数
inputshape输入的形状
return_sequences是否返回序列
units就是神经元的数量
activation是激活函数,默认是’tanh’
其中对于inputshape和return_sequences做详细的介绍
inputshape是输入的句子or序列的形状,输入应该为:
( t i m e s t e p , s e q _ l e n ) (timestep,seq\_len) (timestep,seq_len)
即(句子中含有词的数量or时间序列中时间节点的数量(即时间步的长度),词的特征维度or时间节点的控制特征个数)
return_sequences是是否返回序列,这里用上面的图片做一个简单的示例
如果return_sequences设置为true的话,返回的就是’love’,‘playing’,‘computer’,'game’这四个词
如果return_sequences设置为false的话,返回的就是’game’这一个词,即最后一个输出
3.keras实操解释
3.1 文本
比如说我们现在有一个文本,整个文本有5句话,每句话有10个词
假设所有的词都是不一样的,那么我们整体就有了50个词,如果采取独热编码,那就是有50的长度,我们称这个长度为50的为vocab,长度是50
那么整体我们数据输入就应该是[5,10,50]这个长度
那么假设我们生成了一个这样子的文本
import tensorflow as tf
tensor = tf.random.uniform(shape=(5, 10, 50), minval=0, maxval=1