简单的卷积神经网络 Posted 2021-04-26 华少的知识宝典
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的卷积神经网络相关的知识,希望对你有一定的参考价值。
写在前面的话
现在,就要进入深度学习的世界了。我这里使用的是Keras之父Francois Chollet 的《Python深度学习》这本书,同时强烈推荐日本作家 斋藤康毅 的《深度学习入门--基于Python的理论与实践》,建议先看一下
《深度学习入门--基于P
yt
hon的理论与实践》 ,讲的很简单明了,十分适合入门,它对神经网络不是直接通过调库实现的看完了之后再来学习
《Python深度学习》。
《Python深度学习》 也讲的很不错,思路清晰,范例也多,我这里直接从第二部分开始记录,第一部分是一些基础,在《深度学习入门》中也可以学得到,以后有时间再更新第一部分吧。
首先书上讲的第一个神经网络——卷积神经网络(Convolutional Neural Networks, CNN)。直接切入主题,使用卷积神经网络在MNIST图像数据集上实现手写数字识别。
from keras.datasets import mnist
(train_images , train_labels), (test_images, test_labels) = mnist.load_data()
第一次运行时,因为本地没有这个数据集,所以程序会自动去网上下载。但这是个国外的网站,下载速度你懂的。这里给出百度网盘地址:
网盘链接:https://pan.baidu.com/s/1SG8KShvRzgu0jg6dMn_2HQ
提取码:5 vxg
(1)将文件放到keras的dataset文件夹下(当你运行上面的程序时,有程序自动创建,程序去下载的数据集就会被存放在这里。如果没有,就自己创一个,文件夹的名称千万不要写错了哦)。一般这个文件夹在C盘下的 .keras 文件夹下(可以参考我的路径:C:\Users\Hasee\.keras\datasets)
import numpy as np
path='./mnist.npz'
f = np.load(path)
train_images, train_labels = f['x_train' ], f['y_train' ]
test_images, test_labels = f['x_test' ], f['y_test' ]
f.close()
在训练之前,我们将对数据进行预处理,将其
重塑为网络期望的形状,并对其进行缩放,使所有值都在
[0,1] 区间内。
例如,由上面可知,训练图像存储在
uint8 类型的
shape(60000,28,28) 数组中,其值在
[0, 255](2的8次方) 区间内。我们将它转换成一个值
在0到1之间 的
shape(60000, 28, 28, 1) 的
float32 数组。
train_images = train_images.reshape((60000 , 28 , 28 , 1 ))
train_images = train_images.astype('float32' ) / 255
test_images = test_images.reshape((10000 , 28 , 28 , 1 ))
test_images = test_images.astype('float32' ) / 255
这种数据的处理方法会经常用到
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
from keras import layers
from keras import models
model = models.Sequential()
model.add (layers.Conv2D(32 ,(3 ,3 ), activation='relu' , input_shape=(28 ,28 ,1 ))) # 卷积层,权重矩阵(窗口)为3*3,激活函数为relu,接收的输入为28*28*1
model.add (layers.MaxPool2D(2 ,2 )) # 最大池化,使用2*2窗口
model.add (layers.Conv2D(64 ,(3 ,3 ), activation='relu' )) # 卷积层,权重矩阵(窗口)为3*3,激活函数为relu
model.add (layers.MaxPool2D(2 ,2 )) # 最大池化,使用2*2窗口
model.add (layers.Conv2D(64 ,(3 ,3 ), activation='relu' )) # 卷积层,权重矩阵(窗口)为3*3,激活函数为relu
使用 summary()函数 看一下当前神经网络的架构
可以看到,每个 卷积层(conv2D) 和 池化层(max_pooling2d) 的输出都是一个(height, width, channels)的3D张量。宽度 和 高度 两个维度的尺寸随着网络的加深而变小。通道数量由传入 卷积层(conv2D) 的第一个参数所控制(32或64)。
由这个架构可以看到,在网络输入形状为 (28,28,1),过滤器形状为(3,3)时,在经过了一个卷积层(conv_2d_1)后,输出形状为(26,26,32)。也就是说,
当过滤器为3*3时,卷积层每次输出都会沿着每个维度缩小2 (详细可以看书上100页的
卷积运算 部分的
1.边界效应与填充 )。
其中,输出形状最后的32是由于卷积层的通道数为32 。然后,接下来是一个 2*2 窗口的最大池化层(max_pooling2d_1),在经过这个层后,输出为 (13,13,32),也就是说,
当池化窗口为 2*2 时,最大池化的输出会将特征图尺寸减半
(通道数不会被改变) 。
model.compile(optimizer='rmsprop' ,
loss='categorical_crossentropy' ,
metrics=['accuracy' ])
history = model.fit(train_images, train_labels, epochs=5, batch_size=64)
这里训练模型时,一共训练5轮(
epochs=5 ),且每个批次大小为64(
batch_size=64 )。训练时,会输出每轮所用的时间,损失函数和正确率。
可以看到,模型训练时,最好的一次正确率可以达到99.29%。
同时,我们也可以在训练时查看自己的GPU使用情况。这里可以看到,我的独立显卡(GPU1)在训练时时被使用了的,这也说明我们之前tensorflow-gpu是安装的成功的。
这里模型训练会返回一个 History 对象,这个对象有一个成员 history,它是一个字典,包含了训练过程中的一些数据,如训练精度(acc),验证精度(val_acc),训练损失(loss),验证损失(val_loss)。
我们这里构建的这个模型比较简单,没有使用到验证集,所以在训练的输出中也没有与验证相关的数据
history.history.acc
history.history.loss
关于 卷积运算 与 最大池化 等的介绍和解释,书上讲的很清楚,就不在赘述了。
以上是关于简单的卷积神经网络的主要内容,如果未能解决你的问题,请参考以下文章
卷积神经网络(原理与代码实现)
卷积神经网络之GAN(附完整代码)
卷积神经网络(CNN)的简单实现(MNIST)
Python MINIST手写集的识别,卷积神经网络,CNN(最简单PyTorch的使用)
卷积神经网络(CNN)讲解及代码
卷积神经网络(CNN)讲解及代码