python3 27.keras使用卷积神经网络(CNN)对MNIST数据集进行分类 学习笔记

文章目录

前言

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

     在关于图像处理等神经网络中,卷积神经网络(Convolutional neural network)是一种常用的方式,具体卷积使用过程中的原理本篇不做详细的介绍。与传统BP神经网络相比,CNN的优势有:

  • 参数共享 parameter sharing
  • 稀疏连接 sparsity of connections
图1.1 卷积操作示例

如图1.1所示,输入图为:32x32x3,通过卷积操作后输出图:28x28x6。则共有计算参数有卷积核参数5*5 = 25个,偏置参数为1个,共有6个卷积核则共有参数(25+1)*6 = 156个参数。而如果输入和输出是传统BP网络,则共有参数约32x32x3 x 28x28x6 ≈14000000个。可以看出使用CNN可以有效的减少神经网络训练需要的参数个数。

     LeNet-5模型是非常经典的CNN网络,它的网络结构图如下图2.1所示:

图2.1 LeNet-5网络结构

     该网络的输入为32x32x1结构,然后进行卷积-平均池化-卷积-平均池化-全连接-全连接-softmax输出。MNIST数据集的输入为28x28x1结构,下面通过tensorflow建立CNN网络对MNIST数据集分类(该网络与LeNet-5不完全一样):

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, Dropout, Convolution2D, MaxPooling2D, Flatten
from keras.optimizers import Adam

# 载入数据
(x_train,y_train), (x_test,y_test) = mnist.load_data()

# (6000,28,28)
print('x_shape:', x_train.shape)
# (6000)
print('y_shape:', y_train.shape)

# 进行数据转换,并归一化
# (60000,28,28) -> (60000, 28, 28, 1)
x_train = x_train.reshape(-1, 28, 28, 1)/255.0
x_test = x_test.reshape(-1, 28, 28, 1)/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()

# 第一个卷积层
# input_shape 输入平面
# filters 卷积核/滤波器个数
# kernel_size 卷积窗口大小
# strides 步长
# padding padding方式 same/valid
# activation 激活函数
model.add(Convolution2D(
        input_shape=(28,28,1), 
        filters=32, 
        kernel_size=5,
        strides=1, 
        padding='same', 
        activation='relu',
    ))

# 第一个池化层
model.add(MaxPooling2D(
        pool_size=2, 
        strides=2, 
        padding='same',
    ))

# 第二个卷积层
model.add(Convolution2D(64, 5, strides=1, padding='same', activation='relu'))
# 第二个池化层
model.add(MaxPooling2D(2, 2, 'same'))

# 把第二个池化层的输出扁平化
model.add(Flatten())
# 第一个全连接层
model.add(Dense(1024, activation='relu'))
# Dropout
model.add(Dropout(0.5))

# 第二个全连接层
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)
# 输出结果:
# x_shape: (60000, 28, 28)
# y_shape: (60000,)
# Epoch 1/10
# 60000/60000 [==============================] - 214s 4ms/step - loss: 0.3343 - acc: 0.9043
# Epoch 2/10
# 60000/60000 [==============================] - 214s 4ms/step - loss: 0.0887 - acc: 0.9729
# Epoch 3/10
# 60000/60000 [==============================] - 214s 4ms/step - loss: 0.0635 - acc: 0.9806
# Epoch 4/10
# 60000/60000 [==============================] - 214s 4ms/step - loss: 0.0493 - acc: 0.9848
# Epoch 5/10
# 60000/60000 [==============================] - 214s 4ms/step - loss: 0.0414 - acc: 0.9873
# Epoch 6/10
# 60000/60000 [==============================] - 225s 4ms/step - loss: 0.0357 - acc: 0.9888
# Epoch 7/10
# 60000/60000 [==============================] - 211s 4ms/step - loss: 0.0299 - acc: 0.9908
# Epoch 8/10
# 60000/60000 [==============================] - 210s 3ms/step - loss: 0.0270 - acc: 0.9913
# Epoch 9/10
# 60000/60000 [==============================] - 211s 4ms/step - loss: 0.0239 - acc: 0.9924
# Epoch 10/10
# 60000/60000 [==============================] - 205s 3ms/step - loss: 0.0206 - acc: 0.9933
# 10000/10000 [==============================] - 12s 1ms/step
# test loss:  0.021567985947515262
# test accuracy:  0.9922

     通过训练结果可知,使用CNN对MNIST数据集分类的效果比BP神经网络要好很多,准确率已经高于99%。LeNet-5网络模型也是一个比较简单的CNN模型,以后会介绍更多深度卷积经典网络。

     
     
     
     
【参考】:
     1. 城市数据团课程《AI工程师》计算机视觉方向
     2. deeplearning.ai 吴恩达《深度学习工程师》
     3. 《机器学习》作者:周志华
     4. 《深度学习》作者:Ian Goodfellow


转载声明:
版权声明:非商用自由转载-保持署名-注明出处
署名 :mcyJacky
文章出处:https://blog.csdn.net/mcyJacky

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MNIST数据集是一个手写数字的图片数据集,包含60,000张训练图片和10,000张测试图片。每张图片大小为28x28像素,灰度图像,数字0-9均有表示。 卷积神经网络CNN是一种深度学习模型,可以有效地进行图像分类。在MNIST数据集上,我们可以使用一个简单的CNN模型来进行分类。 1. 数据预处理 首先,我们需要将MNIST数据集加载到程序中,并进行预处理。我们可以使用Keras库中的mnist.load_data()函数来加载数据集,然后将像素值归一化到0-1的范围内: ```python from keras.datasets import mnist from keras.utils import to_categorical # 加载数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. # 将标签转换为one-hot编码 y_train = to_categorical(y_train, num_classes=10) y_test = to_categorical(y_test, num_classes=10) ``` 2. 定义CNN模型 接下来,我们需要定义一个CNN模型来对MNIST数据集进行分类。我们可以使用Keras库来构建模型。 CNN模型通常由卷积层、池化层和全连接层组成。在MNIST数据集上,我们可以使用以下模型: ```python from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense # 定义CNN模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(10, activation='softmax')) ``` 这个模型包含三个卷积层和两个全连接层。卷积层用于提取图像的特征,池化层用于减小特征图的大小,全连接层用于将特征图映射到类别标签。 3. 训练模型 在定义好模型之后,我们需要对模型进行训练。我们可以使用Keras库中的compile()函数来编译模型,并使用fit()函数来训练模型。 ```python # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train.reshape(-1, 28, 28, 1), y_train, epochs=5, batch_size=64, validation_data=(x_test.reshape(-1, 28, 28, 1), y_test)) ``` 在训练模型时,我们需要将输入数据的形状从(60000, 28, 28)转换为(60000, 28, 28, 1),因为Keras默认的卷积层输入需要四个维度。 4. 评估模型 训练模型后,我们需要对模型进行评估。我们可以使用evaluate()函数来评估模型的性能。 ```python # 评估模型 score = model.evaluate(x_test.reshape(-1, 28, 28, 1), y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 在MNIST数据集上,我们可以得到约99%的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值