python卷积神经网络入门
注:东北大学理学院大三暑期实训(第四天)
卷积神经网络
案例:识别数字Mnist数据集
图像输入:
图片尺寸越大,全连接(经典神经网络)所需要的计算量越大。
可采用局部连接模式(卷积神经网络)来降低参数数目(局部感受野)。
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
from keras.utils import np_utils
import matplotlib.pyplot as plt
from keras.datasets import mnist
# 数据预处理
(train_image, train_label),(test_image, test_label) = mnist.load_data()
train_image_4D = train_image.reshape(60000, 28, 28, 1).astype(float)
test_image_4D = test_image.reshape(10000, 28, 28, 1).astype(float)
#数据集的标准化,归一化处理,去除量纲的影响,让数值都落在0~1之间
train_image_4D_normalize = train_image_4D / 255
test_image_4D_normalize = test_image_4D / 255
#一位有效编码来对标签进行预处理
train_label_onehotencoding = np_utils.to_categorical(train_label)
test_label_onehotencoding = np_utils.to_categorical(test_label)
提取特征
在图片大致相同的位置找到一些粗糙的特征进行匹配
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Conv2D, MaxPooling2D, Flatten
卷积
将特征变成过滤器,在新的样例的每一个位置进行卷积计算。卷积计算只需将两个小块内对应位置的像素值进行乘法运算再求和后归一即可。值越大代表匹配程度越高。
图像尺寸增大时,其内部的加法、乘法和除法操作的次数会增加得很快,每一个filter的大小和filter的数目呈线性增长。由于有这么多因素的影响,很容易使得计算量变得相当庞大。
model = Sequential() #建立一个线性堆叠的模型
#filter:滤镜个数 kernel_size:滤镜尺寸 padding:不影响图片的大小 input_shape:输入图片的尺寸, activation:激活函数
model.add(Conv2D(filters=16, kernel_size=(5,5), padding='same', input_shape=(28,28,1), activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2))) #将28*28的图片转为14*14图片
model.add(Conv2D(filters=36, kernel_size=(5,5), padding='same', activation='relu'))
池化
池化的目的是为了有效减少计算量。就是将输入图像进行缩小,减少像素信息,只保留重要信息。
池化的操作也很简单,通常情况下,池化区域是2*2大小,然后按一定规则转换成相应的值,例如取这个池化区域内的最大值(max-pooling)、平均值(mean-pooling)等,以这个值作为结果的像素值。
model.add(MaxPooling2D(pool_size = (2, 2))) #将14*14的图片转为7*7图片
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(units=128, kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
#隐藏层和输出层之间的关联
model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))
#每一层神经单元的个数:上一层神经单元个数*本层神经单元个数+本层神经单元个数
#总计神经单元个数=各层之和
print(model.summary())
激活函数ReLU
常用的激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全连接层,后者ReLU常见于卷积层。
感知机中的激活函数是用来加入非线性因素,把卷积层的输出结果做非线性映射。而卷积神经网络中,使用ReLU的原因是其收敛快,计算公式和求梯度都很简单。
深度神经网络
将卷积、激活函数、池化组合并加大网络深度增加更多层就得到了深度神经网络。
全连接层
全连接层在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(units=128, kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
#隐藏层和输出层之间的关联
model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))
#每一层神经单元的个数:上一层神经单元个数*本层神经单元个数+本层神经单元个数
#总计神经单元个数=各层之和
print(model.summary())
'''
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 28, 28, 16) 416
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 14, 14, 36) 14436
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 36) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 7, 7, 36) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 1764) 0
_________________________________________________________________
dense_1 (Dense) (None, 128) 225920
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_2 (Dense) (None, 10) 1290
=================================================================
Total params: 242,062
Trainable params: 242,062
Non-trainable params: 0
_________________________________________________________________
None
'''
卷积神经网络
将以上所有结果串起来后,就形成了一个“卷积神经网络”(CNN)结构。
模型训练
#配置下训练模型 loss:设置损失函数 adam:优化器,是训练更快结果更加的收敛
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
#validation_split:从训练数据集中预留一部分用于验证数据 epochs:训练次数 batch_size:每次取出多少数据用于训练 verbose:2表示显示训练过程
train_history = model.fit(train_image_4D_normalize, train_label_onehotencoding, validation_split=0.2, epochs=10, batch_size=200, verbose=2)
训练结果
import matplotlib.pyplot as plt
def show_train_history(train_history , train, validation):
plt.plot(train_history.history[train])
plt.plot(train_history.history[validation])
plt.title('Train History')
plt.ylabel(train)
plt.xlabel('Epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
show_train_history(train_history, 'acc', 'val_acc')
show_train_history(train_history, 'loss', 'val_loss')
预测实例
scores = model.evaluate(test_image_4D_normalize, test_label_onehotencoding)
print(scores)
'''
9856/10000 [============================>.] - ETA: 0s[0.026089644191978734, 0.9915]
'''
总结
总体上可以看出,卷积神经网络CNN比多层感知器模型MLP要优秀,不但准确率提升明显,而且过度拟合的问题也被有效抑制了
本文地址:https://blog.csdn.net/Kingsleyandher/article/details/107377929
上一篇: 火爆朋友圈的微投票 能限制投票区域