基于卷积神经网络的手写体识别(从零开始搭建神经网络)

一.学习使用深度学习库——Keras

1.1 Keras介绍:是由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化,支持CPU和GPU

1.2 Keras的安装:

1.2.1安装方法

方法一:在自己环境的终端安装

Keras安装前需要安装numpy,matplotlib,scipy,tensoflow

步骤:

pip install numpy
pip install matplotlib
pip install scipy
pip install tensorflow
pip install keras

方法二:在anaconda prompt中安装

步骤:

pip install --upgrade --ignore-installed tensorflow
pip install keras

1.2.2测试是否成功

在命令行输入python,进入python环境输入以下内容

import numpy
import matplotlib
import tensorflow as tf
import keras

如果没有报错,则安装完成

二. Keras网络层

2.1 Keras的层主要包括:常用层(Core)、卷积层(Convolutional)、池化层(Pooling)、局部连接层递归层(Recurrent)、嵌入层( Embedding)、高级激活层规范层噪声层包装层,当然也可以编写自己的层

2.2 层的主要操作

layer.get_weights() #获得每一层的权重
layer.set wetights(weights)#把这一层的权重加载到这一层
config = layer.get config()#保存该层的配置
layer.input#输入张量
layer.output#输出张量
layer.input shape#输入数据的形状
layer.output shape#输出数据的形状

2.3 本项目中使用的层

2.3.1 二维卷积层

2.3.2 全连接层

2.3.3 Activation层

三.搭建思路

3.1 Sequential模型主要有两种构造方式

3.1.1list构造:

from keras.mDenseodel import Sequential
from keras.layers import Dense, Activation
layer = [ Dense(64, input_shape = (784, ) ),
          Activation('relu'),
          Dense(10),
          Activation('softmax']
model = Sequential(layer)

Dense参数详解

Dense(
        inputs,#输入一个二维tensor
        units,#输入神经网络中的结点数
        activation = None,#输入激活函数
                          #主要的激活函数有relu,softmax,sigmoid linear等
        use_bias = True,#是否适用偏置向量
        kernel_initializer = None,#权重矩阵的初始化函数
        bias_constraint = None,#偏置项的初始化函数
        kernel_regualrizer = None,#权重矩阵的正则化函数
        bias_regularizer = None,#偏置项的正则化函数
        activity_regularizer = None,#输出的正则化函数
        trainable = None,#如果为Ture将变量添加到图集合GraphKeys.TRAINABLE_VARIABLES中。
        name = None,#层的名称
        reuse = None,#是否重复使用参数

)

Cov2d参数详解:

Conv2D(
        filters,#输出空间的维度
        kernel_size,#卷积核的大小
        strides=(1, 1),#沿高度和宽度卷积的步长
        padding="valid",#卷积会导致输出图像越来越小,图像边界信息丢失,若想保持卷积后的图像大小不变,需要设置padding参数为same
        data_format=None,#输入维度的顺序,默认为channels——last
        dilation_rate=(1, 1),#用于扩展卷积的扩展率
        groups=1,#
        activation=None,#激活函数
        use_bias=True,#是否有bias单元
        kernel_initializer="glorot_uniform",#默认是GlorotUniform ,通过输入和输出单元个数来推演权重矩阵尺寸 
        bias_initializer="zeros",#kernel bias单元的初始化器,默认是0
        kernel_regularizer=None,
        bias_regularizer=None,
        activity_regularizer=None,
        kernel_constraint=None,
        bias_constraint=None
)

3.1.2 add( )构造:

#向Sequential逐层加入layer
from keras.models import Sequential
from keras.layers import Dense, Activation
 
model = Sequential() # 定义模型
model.add(Dense(units=64, activation='relu', input_dim=100)) # 定义网络结构
model.add(Dense(units=10, activation='softmax')) # 定义网络结构
model.compile(loss='categorical_crossentropy', # 定义loss函数、优化方法、评估标准
              optimizer='sgd',
              metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32) # 训练模型
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) # 评估模型

3.2 model构造:

from keras.layers import Input, Dense
from keras.models import Model
 
# 输入层,确定输入维度
input = Input(shape = (784, ))
# 2个隐含层,每个都有64个神经元,使用relu激活函数,且由上一层作为参数
x = Dense(64, activation='relu')(input)
x = Dense(64, activation='relu')(x)
# 输出层
y = Dense(10, activation='softmax')(x)
 
model = Model(inputs=input, outputs=y)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(data, labels)

四.MNIST数据集

3.1 数据集下载地址:http://yann.lecun.com/exdb/mnist/

3.2 数据集的内容

   

训练集样本:train-images-idx3-ubyte.gz:  training set images (9912422 bytes)
训练集标签:train-labels-idx1-ubyte.gz:  training set labels (28881 bytes)
测试集样本 :t10k-images-idx3-ubyte.gz:   test set images (1648877 bytes)
测试集标签:t10k-labels-idx1-ubyte.gz:   test set labels (4542 bytes)

四.代码的实现

4.1 数据集的读取(省略 写在MNIST.py中)

4.2 导入需要用的库

import numpy as np
import MNIST
from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.layers import Conv2D, AveragePooling2D

4.3 定义训练和网络层需要的参数

batch_size = 16 #批量处理的数据数量
nb_classes = 10 #分类的数目
epochs = 10 #迭代次数
img_rows, img_cols = 28, 28
nb_filters = 32 #卷积核的个数
pool_size = (2, 2) #池化层的大小
kernel_size = (5, 5) #卷积核的大小
input_shape = (img_cols, img_cols) #输入的图片维度

4.4 加载训练集

x_train, y_train = MNIST.get_training_data_set(6000, False)

4.5 数据的归一化

x_train = np.array(x_train).astype(bool).astype(float)/255
y_train = np.array(y_train)

4.6 增加一个维度

x_train = x_train[:, :, :, np.newaxis]#样本个数, 宽度, 高度, 通道数

4.7 模型的搭建

#模型建立
model = Sequential()
model.add(Conv2D(6, kernel_size, input_shape = input_shape, ))#卷积层
model.add(AveragePooling2D(pool_size = pool_size, strides = 2))#针对2D输入的平均池化层
#平均池化:前向传播卷积取平均,能够很好保留背景,但容易使图片模糊,反向传播取平均分配给每个位置
model.add(Conv2D(12, kernel_size, strides = 2))#卷积层
model.add(AveragePooling2D(pool_size = pool_size, strides = 2))#池化层
model.add(Flatten(0))#拉成一维的数据
model.add(Dense(nb_classes))
model.add(Activation("softmax"))

池化层的选用有以下几种:

1.平均池化(mean-pooling)

2.最大池化(max-pooling)

3.随机池化(Stochastic-pooling)

4.全局平均池化(global average pooling)

4.8 模型的编译

model.compile(loss = 'categorical crossentropy', optimizer = 'sgd', metrics = ['acccuracy'])

4.9 模型的训练与评估保存

#模型的训练
model.fit(x_train, y_train, batch_size = batch_size, epochs = epochs)
#模型的评估
score = model.evaluate(x_train, y_train, verbose = 1)#返回loss value以及metrics value
print('Train score:', score[0])
print('Train accuracy:', score[1])
#模型的保存
model.save('cnn_model.h5')

猜你喜欢

转载自blog.csdn.net/m0_62577716/article/details/128444118
今日推荐