深度学习:Keras实现卷积神经网络CNN

写在前面:

刚刚开始学习keras,就在这里记录一下学习过程啦。
本文为使用卷积神经网络CNN进行mnist手写字符的识别,希望自己就此走进deep learning的大门吧。

keras文档:https://keras.io/zh/
莫烦python bilibili链接:https://space.bilibili.com/243821484/video

一、代码

keras相关导入:

import numpy as np                                #其实并没有用到numpy。。。
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Activation,Convolution2D,MaxPooling2D,Flatten
from keras.optimizers import Adam

关于numpy使用用法可查看numpy文档:https://www.numpy.org.cn/index.html

导入mnist手写字符数据集:

from keras.datasets import mnist 
(X_train,y_train),(X_test,y_test)=mnist.load_data()

训练集为 60,000 张 28x28 像素的灰度图像,测试集为 10,000 同规格的图像,总共 10 类数字标签。
若是第一次使用该语句,会自动从官网下载数据集。

数据集的预处理:

输入的图片是28*28:

img_rows,img_cols=28,28

预处理:
train.shape共有4个参数,分别代表(图像数量,颜色通道,长,宽)
因为是灰度图,所以颜色通道为1,即表示图像的高度为1
除以255表示数据的归一化处理

X_train=X_train.reshape(X_train.shape[0],1,img_rows,img_cols)/255   
X_test=X_test.reshape(X_test.shape[0],1,img_rows,img_cols)/255

把类别0-9(共10个类别)转换成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()

Convolution2D:

Conv layer 1 output shape(32,28,28):

model.add(Convolution2D(
    batch_input_shape=(None,1,28,28),     #首个网络层需要指定shape 
    filters=32,                           #表示输出的维度(卷积核的数目)为32,即生成32张不同feature的图片
    kernel_size=5,                        #卷积核的大小(各个空间维度都是5)
    strides=1,                            #每次卷积核前进的数量(各个空间维度相同,1表示卷积后的大小与原先图像大小一致)
    padding='same',                       #表示保留边界处的卷积结果
    data_format='channels_first'          #表示图像的通道维的位置在第一个
))
model.add(Activation('relu'))             #激活函数

MaxPooling2D:

Pooling layer 1(max pooling) output shape(32,14,14):
缩小两个维度(长和宽),不压缩高度。

model.add(MaxPooling2D(
    pool_size=2,          #两个维度(竖直,水平)上的下采样因子都是2,使图片在两个维度上均变为原长的一半
    strides=2,            #步长值
    padding='same',  
    data_format='channels_first'
))      

继续叠加一层卷积层和池化层:

Conv layer 2 output shape(64,14,14):

model.add(Convolution2D(64,5,strides=1,padding='same'))
model.add(Activation('relu'))

Pooling layer 2(max pooling)output shape(64,7,7):

model.add(MaxPooling2D(2,2,'same',data_format='channels_first'))

Flatten层:

用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡;
Flatten不影响batch的大小;
即从(64* 7* 7)———>(3136)

model.add(Flatten())

全连接层:

Fully connected layer 1 input shape (6477)=(3136),output shape(1024):

model.add(Dense(1024))
model.add(Activation('relu'))

Fully connected layer 2 to shape(10) for 10 classes

model.add(Dense(10))        
model.add(Activation('softmax'))   #使用softmax进行分类

定义优化器optimizer:

不知道使用什么优化器的时候,就用Adam。。。

adam=Adam(lr=1e-4)      #自适应的学习率方法

compile:

model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['accuracy'])                #指定衡量模型的指标

训练&测试&输出结果:

print('training-----')
model.fit(X_train,y_train,epochs=1,batch_size=64,)         #使用fit功能来training;epochs表示训练的轮数;
                                                           #batch_size表示进行梯度下降时每个batch包含的样本数。

print('\ntesting-----')
loss,accuracy=model.evaluate(X_test,y_test)           

print('\ntest loss: ',loss)
print('\ntest accuracy: ',accuracy)

二、结果

训练结果:
在这里插入图片描述
测试结果:
深度学习:Keras实现卷积神经网络CNN_第1张图片

你可能感兴趣的:(Keras)