首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tensorflow2.0实现简单的RNN文本分析

Tensorflow2.0实现简单的RNN文本分析

作者头像
用户7569543
发布2020-07-19 21:20:06
7800
发布2020-07-19 21:20:06
举报

前面我们介绍的全连接神经网络以及卷积神经网络都只能单独处理一个个输入,并且前一个输入和后一个输入往往是没有直接联系。但是,在某些情况下我们需要很好地处理序列信息,即前一个输入与后一个输入是有关系的。比如我们理解一句话的时候,往往需要联系前后的句子才能得到这句话表达的准确含义。序列问题有很多,例如语音对话、文本理解以及视频/音频分析等。今天老shi将给大家介绍深度学习中另外一种非常重要的神经网络类型——循环神经网络RNN,它最擅长处理序列问题!

举个栗子,比如,老师说小明总是上课迟到,今天罚____打扫卫生。很明显,这里空缺的部分大概率是说小明,而不是我。

那么,循环神经网络到底是啥?循环神经网络(Recurrent Neural Network)种类繁多,我们先从最简单的循环神经网络开始吧。

基本的循环神经网络

下图是一个简单的循环神经网络,它由输入层、一个隐藏层和一个输出层组成:

这个图看起来有点奇怪,跟我们之前介绍的神经网络都不太一样。这是因为循环神经网络实在是不好画,这是简化+抽象后的画法。如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里神经元节点没有画出来);s是一个向量,它表示隐藏层的值(这里隐藏层面只画了一个节点,你也可以想象这一层其实是有多个节点,节点数与向量s的维度相同);U是输入层到隐藏层的权重矩阵(类似于全连接神经网络中每层的权重);o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵。现在我们来看看W到底是什么?因为循环神经网络的隐藏层的值s不仅仅取决于当前这一次的输入x,还取决于上一次隐藏层的值s。所以,权重矩阵W就是隐藏层上一次的值作为这一次的输入的权重。

如果我们把上面的图展开,循环神经网络大概就是下面这个样子:

现在看上去就比较清楚了,这个网络在t时刻接收到输入Xt之后,隐藏层的值是St,输出值是Ot。关键一点是,St的值不仅仅取决于Xt,还取决于St-1。我们可以用下面的公式来表示循环神经网络的计算方法:

式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值作为这一次的输入的权重矩阵,f是激活函数。

从上面的公式我们可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵 W。如果反复把式2代入到式1,我们将得到:

从上面可以看出,循环神经网络的输出值,是受前面很多次输入值影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。

当然,前面介绍的只是最基本的循环神经网络结构,除此之外,其实循环神经网络还有例如双向循环神经网络、深度循环神经网络以及很多其他的变种,这里老shi不打算一次给大家介绍完(介绍了你们也接受不了,哈哈)。最后是一个非常简单的文本分析RNN代码实践案例,有兴趣的同学可以跟着现实一下。下节课老shi准备给大家介绍非常常用的RNN变种LSTM和GRU,敬请期待!!

from tensorflow import kerasfrom tensorflow.keras import layers

num_words = 30000maxlen = 200

#导入数据(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=num_words)
#x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen, padding='post')x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen, padding='post')print(x_train.shape, ' ', y_train.shape)print(x_test.shape, ' ', y_test.shape)

def RNN_model():    model = keras.Sequential([        layers.Embedding(input_dim=30000, output_dim=32, input_length=maxlen),        layers.SimpleRNN(32, return_sequences=True),        layers.SimpleRNN(1, activation='sigmoid', return_sequences=False)    ])    model.compile(optimizer=keras.optimizers.Adam(),                 loss=keras.losses.BinaryCrossentropy(),                 metrics=['accuracy'])return model
model = RNN_model()model.summary()

history = model.fit(x_train, y_train, batch_size=64, epochs=5,validation_split=0.1)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 多赞云数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档