前言
计算机视觉系列之学习笔记主要是本人进行学习人工智能(计算机视觉方向)的代码整理。本系列所有代码是用python3编写,在平台Anaconda中运行实现,在使用代码时,默认你已经安装相关的python库,这方面不做多余的说明。本系列所涉及的所有代码和资料可在我的github上下载到,gitbub地址:https://github.com/mcyJacky/DeepLearning-CV,如有问题,欢迎指出。
一、循环神经网络RNN简介
普通的神经网络只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。下面是一个简单的循环神经网络,它由输入层、一个隐藏层和一个输出层组成:
![](https://i-blog.csdnimg.cn/blog_migrate/6dae5e45eb92d35da2adeb8b6ff04c71.jpeg)
如果把上面有
W
W
W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。
x
x
x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);
s
s
s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量
s
s
s的维度相同);
U
U
U是输入层到隐藏层的权重矩阵,
o
o
o也是一个向量,它表示输出层的值;
V
V
V是隐藏层到输出层的权重矩阵。
那么,现在我们来看看
W
W
W是什么。循环神经网络的隐藏层的值
s
s
s不仅仅取决于当前这次的输入
x
x
x,还取决于上一次隐藏层的值
s
s
s。权重矩阵
W
W
W就是隐藏层上一次的值作为这一次的输入的权重。
![](https://i-blog.csdnimg.cn/blog_migrate/9f28f303b818784c7a922db5c36f613f.jpeg)
从图1.2中我们更清楚的看到,这个网络在 t t t时刻收到输入 x t x_t xt之后,隐藏层的值是 s t s_t st,输出值是 O t O_t Ot。关键的一点是, s t s_t st的值不仅仅取决于 x t x_t xt,还取决与 s t − 1 s_{t-1} st−1。我们可以用下面的公式来表示循环神经网络计算方法:
O
t
=
g
(
V
⋅
S
t
)
O_t = g(V ·S_t)
Ot=g(V⋅St)
S
t
=
f
(
U
⋅
X
t
+
W
⋅
S
t
−
1
)
S_t = f(U·X_t + W·S_{t-1})
St=f(U⋅Xt+W⋅St−1)
二、使用SimpleRNN识别MNIST手写数字
MNIST数据集是图片的输入28x28x1格式,正常情况下我们不使用RNN方法。这边我们是为了方便,将其看出序列结构模型。其中图片的宽度28为输入,图片的高度28为序列的长度。我们使用最简单的SimpleRNN方法,当然也可以使用LSTM或GRU等方法。我们设置SimpleRNN隐藏层的block个数为cell_size = 50,输出的分类为10,具体实现如下:
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.layers.recurrent import SimpleRNN, LSTM, GRU
from keras.optimizers import Adam
# 数据长度 一行有28个像素
input_size = 28
# 序列的长度
time_steps = 28
# 隐藏层block的个数
cell_size = 50
# 载入数据
(x_train,y_train), (x_test,y_test) = mnist.load_data()
# (60000,28,28)
x_train = x_train/255.0
x_test = x_test/255.0
# 换one hot格式
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
# 创建模型
model = Sequential()
# 循环神经网络
model.add(SimpleRNN(
units = cell_size, # 输出
input_shape = (time_steps, input_size), # 输入
))
# 输出层
model.add(Dense(10, activation='softmax'))
# 定义优化器
adam = Adam(lr=1e-4)
# 定义优化器、loss function, 训练过程中计算准确率
model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, batch_size=64, epochs=10)
# 评估模型
loss, accuracy = model.evaluate(x_test, y_test)
print('test loss', loss)
print('test accuracy', accuracy)
# 输出结果:
# Epoch 1/10
# 60000/60000 [==============================] - 7s 110us/step - loss: 1.5584 - acc: 0.5157
# Epoch 2/10
# 60000/60000 [==============================] - 6s 99us/step - loss: 0.8867 - acc: 0.7244
# Epoch 3/10
# 60000/60000 [==============================] - 6s 102us/step - loss: 0.6832 - acc: 0.7817
# Epoch 4/10
# 60000/60000 [==============================] - 6s 102us/step - loss: 0.5821 - acc: 0.8151
# Epoch 5/10
# 60000/60000 [==============================] - 6s 98us/step - loss: 0.5173 - acc: 0.8409
# Epoch 6/10
# 60000/60000 [==============================] - 6s 100us/step - loss: 0.4662 - acc: 0.8589
# Epoch 7/10
# 60000/60000 [==============================] - 6s 101us/step - loss: 0.4213 - acc: 0.8749
# Epoch 8/10
# 60000/60000 [==============================] - 6s 105us/step - loss: 0.3848 - acc: 0.8868
# Epoch 9/10
# 60000/60000 [==============================] - 6s 103us/step - loss: 0.3575 - acc: 0.8942
# Epoch 10/10
# 60000/60000 [==============================] - 6s 103us/step - loss: 0.3339 - acc: 0.9018
# 10000/10000 [==============================] - 1s 91us/step
# test loss 0.31587359941601756
# test accuracy 0.9102
从上面程序输入结果看出预测的准确率也较高,当然这个程序不能反映出循环神经网络本身的功能,只演示出了计算的过程。
【参考】:
1. 城市数据团课程《AI工程师》计算机视觉方向
2. deeplearning.ai 吴恩达《深度学习工程师》
3. 《机器学习》作者:周志华
4. 《深度学习》作者:Ian Goodfellow
转载声明:
版权声明:非商用自由转载-保持署名-注明出处
署名 :mcyJacky
文章出处:https://blog.csdn.net/mcyJacky