简单的卷积神经网络

Posted 华少的知识宝典

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的卷积神经网络相关的知识,希望对你有一定的参考价值。

写在前面的话

现在,就要进入深度学习的世界了。我这里使用的是Keras之父Francois Chollet 的《Python深度学习》这本书,同时强烈推荐日本作家 斋藤康毅 的《深度学习入门--基于Python的理论与实践》,建议先看一下 《深度学习入门--基于P yt hon的理论与实践》,讲的很简单明了,十分适合入门,它对神经网络不是直接通过调库实现的看完了之后再来学习 《Python深度学习》 《Python深度学习》也讲的很不错,思路清晰,范例也多,我这里直接从第二部分开始记录,第一部分是一些基础,在《深度学习入门》中也可以学得到,以后有时间再更新第一部分吧。


卷 积 神 经 网 络(CNN)


首先书上讲的第一个神经网络——卷积神经网络(Convolutional Neural Networks, CNN)。直接切入主题,使用卷积神经网络在MNIST图像数据集上实现手写数字识别。


1、
  1、加载数据       

书上的代码:
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
第一次运行时,因为本地没有这个数据集,所以程序会自动去网上下载。但这是个国外的网站,下载速度你懂的。这里给出百度网盘地址:
网盘链接:https://pan.baidu.com/s/1SG8KShvRzgu0jg6dMn_2HQ提取码:5vxg
下载下来后,有两种使用方法。
(1)将文件放到keras的dataset文件夹下(当你运行上面的程序时,有程序自动创建,程序去下载的数据集就会被存放在这里。如果没有,就自己创一个,文件夹的名称千万不要写错了哦)。一般这个文件夹在C盘下的 .keras 文件夹下(可以参考我的路径:C:\Users\Hasee\.keras\datasets)
(2)直接读取本地文件获取数据集
import numpy as np
path='./mnist.npz'f = np.load(path)
# MNIST数据集里为四个numpy集合train_images, train_labels = f['x_train'], f['y_train']test_images, test_labels = f['x_test'], f['y_test']
f.close()



2、探索数据集       
简单的卷积神经网络


简单的卷积神经网络



3、数据预处理         
简单的卷积神经网络


在训练之前,我们将对数据进行预处理,将其 重塑为网络期望的形状,并对其进行缩放,使所有值都在 [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)



4、构建并使用CNN       
简单的卷积神经网络


实例化一个小型卷积神经网络
from keras import layersfrom 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*1model.add(layers.MaxPool2D(2,2)) # 最大池化,使用2*2窗口model.add(layers.Conv2D(64,(3,3), activation='relu')) # 卷积层,权重矩阵(窗口)为3*3,激活函数为relumodel.add(layers.MaxPool2D(2,2)) # 最大池化,使用2*2窗口model.add(layers.Conv2D(64,(3,3), activation='relu')) # 卷积层,权重矩阵(窗口)为3*3,激活函数为relu
使用 summary()函数 看一下当前神经网络的架构
model.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 属性history.history.acchistory.history.loss


关于 卷积运算最大池化 等的介绍和解释,书上讲的很清楚,就不在赘述了。



以上是关于简单的卷积神经网络的主要内容,如果未能解决你的问题,请参考以下文章

卷积神经网络(原理与代码实现)

卷积神经网络之GAN(附完整代码)

卷积神经网络(CNN)的简单实现(MNIST)

Python MINIST手写集的识别,卷积神经网络,CNN(最简单PyTorch的使用)

卷积神经网络(CNN)讲解及代码

卷积神经网络(CNN)讲解及代码