DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

本文深入浅出地介绍了CNN卷积神经网络的基本原理,并基于Python和Theano详细解读了LeNet5的实现过程,包括卷积、子采样、全连接层的构建和训练方法。同时,文章指出了代码实现与经典LeNet5结构的差异。

 DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解


@author:wepon

@blog:http://blog.csdn.net/u012162613/article/details/43225445


本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自Convolutional Neural Networks (LeNet)经详细注释的代码和原始代码:放在我的github地址上,可下载



一、CNN卷积神经网络原理简介

要讲明白卷积神经网络,估计得长篇大论,网上有很多博文已经写得很好了,所以本文就不重复了,如果你了解CNN,那可以往下看,本文主要是详细地解读CNN的实现代码。如果你没学习过CNN,在此推荐周晓艺师兄的博文:Deep Learning(深度学习)学习笔记整理系列之(七),以及UFLDL上的卷积特征提取池化


CNN的最大特点就是稀疏连接(局部感受)和权值共享,如下面两图所示,左为稀疏连接,右为权值共享。稀疏连接和权值共享可以减少所要训练的参数,减少计算复杂度。


       


至于CNN的结构,以经典的LeNet5来说明:




这个图真是无处不在,一谈CNN,必说LeNet5,这图来自于这篇论文:Gradient-Based Learning Applied to Document Recognition,论文很长,第7页那里开始讲LeNet5这个结构,建议看看那部分。


我这里简单说一下,LeNet5这张图从左到右,先是input,这是输入层,即输入的图片。input-layer到C1这部分就是一个卷积层(convolution运算),C1到S2是一个子采样层(pooling运算),关于卷积和子采样的具体过程可以参考下图:


要获取卷积神经网络CNN代码的详细解释,可参考《DeepLearning tutorial4CNN卷积神经网络原理简介+代码详解》,该文章对上一篇文章介绍CNN算法时涉及的定义LeNetConvPoolLayer、HiddenLayer、LogisticRegression这三种layer给出了详细代码注解 [^2]。 以用于对MNIST数据集进行手写数字分类的简单CNN为例,其网络包含一个卷积层(32个滤波器,大小为5x5),一个池化层(最大池化,池化窗口大小为2x2),一个全连接层(10个输出,对应10个类别),和一个softmax激活函数,训练过程使用交叉熵损失函数和Adam优化算法 [^4]。 经典CNN模型LENET - 5的流程为:image -> Convolution -> Max Pooling -> Convolution -> Max Pooling -> Fully Connected Layer -> Fully Connected Layer -> classifier [^3]。 以下是一个简单的基于Python和Keras库实现上述简单CNN对MNIST数据集进行手写数字分类的示例代码及简要解释: ```python import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from tensorflow.keras.optimizers import Adam from tensorflow.keras.losses import SparseCategoricalCrossentropy # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255 x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255 # 构建CNN模型 model = Sequential([ # 卷积层,32个滤波器,大小为5x5 Conv2D(32, (5, 5), activation='relu', input_shape=(28, 28, 1)), # 池化层,最大池化,池化窗口大小为2x2 MaxPooling2D((2, 2)), # 将多维数据展平为一维 Flatten(), # 全连接层,10个输出,对应10个类别 Dense(10, activation='softmax') ]) # 编译模型,使用交叉熵损失函数和Adam优化算法 model.compile(optimizer=Adam(), loss=SparseCategoricalCrossentropy(), metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) ``` 代码解释: 1. **数据加载与预处理**:使用`mnist.load_data()`加载MNIST数据集,将图像数据进行归一化处理并调整形状以适应CNN输入要求。 2. **模型构建**:使用`Sequential`模型依次添加卷积层、池化层、展平层和全连接层。卷积层使用32个5x5的滤波器,激活函数为`relu`;池化层采用最大池化,窗口大小为2x2;全连接层输出10个类别,使用`softmax`激活函数。 3. **模型编译**:使用`Adam`优化器和`SparseCategoricalCrossentropy`损失函数进行编译。 4. **模型训练**:使用`fit`方法对模型进行训练,指定训练数据、训练轮数和验证数据。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值