python3 28.keras使用循环神经网络(SimpleRNN)对MNIST数据集进行分类 学习笔记

前言

     计算机视觉系列之学习笔记主要是本人进行学习人工智能(计算机视觉方向)的代码整理。本系列所有代码是用python3编写,在平台Anaconda中运行实现,在使用代码时,默认你已经安装相关的python库,这方面不做多余的说明。本系列所涉及的所有代码和资料可在我的github上下载到,gitbub地址:https://github.com/mcyJacky/DeepLearning-CV,如有问题,欢迎指出。

一、循环神经网络RNN简介

     普通的神经网络只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。下面是一个简单的循环神经网络,它由输入层、一个隐藏层和一个输出层组成:

图1.1 简单RNN网络结构

     如果把上面有 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就是隐藏层上一次的值作为这一次的输入的权重。

图1.2 RNN网络结构展开

     从图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} st1。我们可以用下面的公式来表示循环神经网络计算方法:

O t = g ( V ⋅ S t ) O_t = g(V ·S_t) Ot=g(VSt)
S t = f ( U ⋅ X t + W ⋅ S t − 1 ) S_t = f(U·X_t + W·S_{t-1}) St=f(UXt+WSt1)

二、使用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

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是使用卷积神经网络MNIST数据集进行分类的步骤: 1. 导入必要的库 ```python import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers ``` 2. 导入并预处理数据集 ```python (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train = x_train.reshape(-1, 28, 28, 1).astype("float32") / 255.0 x_test = x_test.reshape(-1, 28, 28, 1).astype("float32") / 255.0 y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) ``` 3. 构建卷积神经网络模型 ```python model = keras.Sequential( [ layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)), layers.MaxPooling2D(pool_size=(2, 2)), layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Flatten(), layers.Dropout(0.5), layers.Dense(10, activation="softmax"), ] ) ``` 4. 编译模型 ```python model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) ``` 5. 训练模型 ```python model.fit(x_train, y_train, batch_size=128, epochs=15, validation_split=0.1) ``` 6. 在测试集上评估模型 ```python test_loss, test_acc = model.evaluate(x_test, y_test) print("Test accuracy:", test_acc) ``` 完整的代码如下: ```python import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 导入并预处理数据集 (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train = x_train.reshape(-1, 28, 28, 1).astype("float32") / 255.0 x_test = x_test.reshape(-1, 28, 28, 1).astype("float32") / 255.0 y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) # 构建卷积神经网络模型 model = keras.Sequential( [ layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)), layers.MaxPooling2D(pool_size=(2, 2)), layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Flatten(), layers.Dropout(0.5), layers.Dense(10, activation="softmax"), ] ) # 编译模型 model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) # 训练模型 model.fit(x_train, y_train, batch_size=128, epochs=15, validation_split=0.1) # 在测试集上评估模型 test_loss, test_acc = model.evaluate(x_test, y_test) print("Test accuracy:", test_acc) ``` 希望能对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值