循环神经网络(1)

作者: zidea | 来源:发表于2019-07-30 07:09 被阅读25次
MachineLearninginMarketing

感谢李宏毅的分享
参考《TensorFlow 学习指南》和《TensorFlow 深度学习》
感谢 sentdex 的分享

RNN 主要用于处理序列,特别是对于文本处理,循环神经网(RNN) 是自然语言处理(NLP)中流行的深度学习算法。

之前我们学习卷积神经网(CNN)用于处理空间上结构数据,CNN 在图像识别有着自身优势,而 RNN 在序列结构数据有着自身优势,而且是其他算法无法代替的。随着时间推移的视频或音频,还是基因序列或者是纵向医疗记录。

循环神经网络(RNN) 实例

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM 
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

mnist = tf.keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()

print(x_train.shape)
print(x_train[0].shape)

从输出的结果可以看出数据结构,这里有 60000 张图片,每张图片都是 28 x 28 个像素组成

(60000, 28, 28)
(28, 28)

图片为 28 行每一个每行都有 28 像素,这样一来我们可以将 28 行理解为顺序输入。我们神经网络会逐行按一定次序来读取数据作为神经元输入。

x_train = x_train / 255.0
x_test = x_test / 255.0

搭建神经网络

model = Sequential()

model.add(LSTM(128, input_shape=(x_train.shape[1:]),activation='relu',return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(128,activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(32,activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10,activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=1e-3,decay=1e-5)
model.compile(loss='sparse_categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

model.fit(x_train,y_train,epochs=3, validation_data=(x_test,y_test))
Epoch 1/3
60000/60000 [==============================] - 166s 3ms/sample - loss: 0.7293 - acc: 0.7573 - val_loss: 0.1420 - val_acc: 0.9559
Epoch 2/3
60000/60000 [==============================] - 162s 3ms/sample - loss: 0.1766 - acc: 0.9524 - val_loss: 0.0902 - val_acc: 0.9732
Epoch 3/3
60000/60000 [==============================] - 164s 3ms/sample - loss: 0.1166 - acc: 0.9687 - val_loss: 0.0844 - val_acc: 0.9752

上面代码演示了如何使用循环神经网来训练我们识别手写数字数据集来完成识别图的模型,这里大家不必担心如何设计出图形以及每一层的作用,随后分享。现在 keras 给我们提供好用 api 帮助可以不加思索快速搭建出循环神经网络。不过还是很有必要了解其背后的原理。下面通过李宏毅老师讲解给大家分享循环神经网络的架构

用向量来表示词汇


在图中有有些词汇是我们之前不知道的所有就需要多加一个维度 other 来容纳那些我们不知道的词汇。
也可以通过图中右侧方式,通过某个词汇字母来对应一个向量元素来表示词汇也就是,这里 apple 为例,apple 中有 app ple ppl 这里字母对应位置会为 1 方式来通过数组来表示词汇。


图中两句话中都会提取出表示目的地的 Taipei ,在之前的我们学习到神经网络,我们输入同样词汇输出就是相同的,但是如果套用到图中两句话显然是不对的,我们一个是要离开台北一个是出发到台北。虽然都是 Taipei 做输入,但是我们需要考虑前面的动词来得出不同输出。


我们的神经网如果有记忆就可以解决上面的问题。这个大家应该不难理解。那么这种的有记忆的神经网就是循环神经网络。从图中来看我们每次输出都会存在 a1 和 a2 中,当在下一次输入时候不但考虑输入也会考虑 a 中保存的值。

我们通过一个示例来解释循环神经网络,假设我们设计神经网络的所有weight(权重)都是 1 我们输入如图上满 sequence 输入是有一定循序,第一次输入 [1,1],会得到输出 [4,4]
而且将 [2,2] 会存储到 a


当我们输入下一个 [1,1] 时候,这里 1 + 1 + 2 + 2 = 6 这里在计算到神经网时候会用到上一次的 2 所有是 6,这个给大家解释一下。所有在第二次输入同样[1,1] 会得到不同结果 [12,12]。这就是循环神经网络与普通神经网的不同。


这张图大家可以自己走一下。
所以我们调换输入循序,就会得到不同结果。我们再次输入同样的话,



大家可能会看到这里有 3 神经网,其实这是 3 神经网络在不同时间被启用了 3 次并不是 3 网络

我们输入 leave 后就会出 leave 然后并且记忆了 leave 这个动词,在输入 taipei 时候隐藏层会考虑 taipei 和上一次记忆 leave 进行计算推测

Elman 网络和 Jordan 网络

上面介绍循环神经网络都应该输入 Elman 网络。Jordan 网络会存储整个网络输出值,然后在下一个时间点读取进来。Jordan 网络的训练结果要好于 Elman,因为我们是将输出值进行记忆,对于输出值,我们是可以通过对比期望值来进行评价。

相关文章

网友评论

    本文标题:循环神经网络(1)

    本文链接:https://www.haomeiwen.com/subject/ymxvrctx.html