深度学习06-卷积神经网络介绍+keras参数详解+mnist手写体案例cnn实现+层数详解

1.卷积神经网络

卷积神经网络是目前深度学习技术领域中非常具有代表性的神经网络之一,在图像分析和处理领域取得了众多突破性的进展,在很多方面的应用效果都非常好。
卷积神经网络CNN(LeNet-5网络详解),这篇讲的非常清楚。
https://blog.csdn.net/weixin_42398658/article/details/84392845
这篇是以LeNet-5网络为例讲解的,介绍了局部感受野(Local Receptive Fields)、共享权值(Shared Weights)、池化(Pooling)三个基本概念。
然后详细介绍了LeNet-5网络的八个层:输入层(INPUT)、卷积层(Convolutions,C1)、池化层(Subsampling,S2)、卷积层(C3)、池化层(Subsampling,S4)、卷积层(C5)、全连接层(F6)、输出层(径向基层)。每层都讲的很清楚,值得仔细研究。

2.卷积层、池化层参数详解

在keras框架下构建cnn模型,我用的是model.add方法。添加相应的卷积层和池化层。

卷积层

卷积层用keras.layer.Conv2D函数。
在这里插入图片描述
注意:需要区别后端函数keras.backend.conv2d()。
可以根据需要添加不同的卷积层函数。
在这里插入图片描述

池化层

池化层可以取最大值进行池化,也可以取平均值进行池化。下面是取最大值进行池化。
在这里插入图片描述
这里是取平均值
在这里插入图片描述
根据需要也可以进行选择
在这里插入图片描述

3.mnist手写体案例cnn实现

手写体的数据集介绍在上篇博客中,这里就不详细说了。https://blog.csdn.net/qq_42871249/article/details/104510591
直接上代码!
注意:这里的reshape更换数据格式和前面不太一样。每个样本转换为三维的,上一篇转化后为一维。

from keras.datasets import mnist

(X_train, y_train), (X_test, y_test) = mnist.load_data()

print('图像数据格式:', X_train.shape)
print("训练集:%2.0f,测试集:%2.0f" %(X_train.shape[0], X_test.shape[0]))

# 将数据转化为更通用的格式
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)

#对因变量做处理
from keras.utils import np_utils

y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

from keras.models import Sequential  
from keras.layers import *
from keras.backend import *

model = Sequential()
# 设定卷积层,共32个卷积核,感受野3*3,不补零,relu连接
model.add(Conv2D(32, (3, 3), padding = 'valid', input_shape = (28, 28, 1),
                 activation = 'relu'))
# 设定池化层为2*2取最大值
model.add(MaxPooling2D(pool_size = (2, 2)))
# 将数据展平为普通的一维格式
model.add(Flatten())
# 设定一个普通的全连接层
model.add(Dense(128, activation = 'relu'))
# 设定输出层
model.add(Dense(10, activation = 'softmax'))

# 卷积层连接权重数:(3 * 3 + 1) * 32
model.summary()

model.compile(loss = 'categorical_crossentropy', 
              optimizer = 'adam', metrics = ['accuracy'])
model.fit(X_train, y_train, epochs = 10)
from keras.models import load_model

model = load_model('mnist_cnn.hdf5')
model.summary()
model.evaluate(X_test, y_test)
# 保存模型
model.save('mnist_cnn.hdf5')

这是模型的summary:
在这里插入图片描述

第一层

卷积层,输入为2828,用33的感受野,步长为1,卷积核的数量为32,所以输出为(26,26,32),连接权重数:(3*3+1)*32=320

第二层

池化层,运用2*2最大池化,所以输出的(26,26,32)变为(13,13,32)

第三层

将数据展平为普通的一维格式,(13,13,32)则变为131332=5408,输出维度为5408

第四层

为普通的全连接层,输出为128,(5408+1)*128=692352

第五层

即输出层,输出维度为10,(128+1)*10=1290

猜你喜欢

转载自blog.csdn.net/qq_42871249/article/details/103183747