深度学习之卷积神经网络

图片皆来自《深度学习入门:基于Python的理论与实现》课本。

卷积神经网络(CNN)

应用于图像识别、语音识别等。

1、整体结构

全连接(Affine层)VS CNN

全连接:
在这里插入图片描述
CNN:
在这里插入图片描述

2、卷积层

2.1 全连接层存在的问题

  • 当输入数据是图像时,图像通常是高、长、通道方向上的3维形状,全连接层输入时,需要将3维数据拉平为1维数据,如手写数字识别。
  • 因为全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。
  • 卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。

2.2 卷积运算

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。
在这里插入图片描述

1×2+2×0+3×1+0×0+1×1+2×2+3×1+0×0+1×2=15

在这里插入图片描述

2.3 填充

在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充(padding)。
在这里插入图片描述

为什么使用填充?

主要是为了调整输出的大小。比如,对大小为(4, 4)的输入数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小比输入大小缩小了 2个元素。这在反复进行多次卷积运算的深度网络中会成为问题。为什么呢?因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。在刚才的例子中,将填充的幅度设为 1,那么相对于输入大小(4, 4),输出大小也保持为原来的(4, 4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。

2.4 步幅

应用滤波器的位置间隔称为步幅(stride)。
在这里插入图片描述

  • 步幅可以指定应用滤波器的间隔。
  • 假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为(OH, OW),填充为P,步幅为S。
    在这里插入图片描述
    无法除尽时,采用四舍五入。

3、池化层

池化是缩小高、长方向上的空间的运算。
在这里插入图片描述
除了Max池化之外,还有Average池化等。相对于Max池化是从目标区域中取出最大值,Average池化则是计算目标区域的平均值。在图像识别领域,主要使用Max池化。

池化层的特征
没有要学习的参数
通道数不发生变化
对微小的位置变化具有鲁棒性(健壮)

在这里插入图片描述

4、卷积层和池化层的实现

4.1 im2col(从图像到矩阵)

im2col是一个函数,将输入数据展开以适合滤波器(权重)。对3维的输入数据应用im2col后,数据转换为2维矩阵(正确地讲,是把包含批数量的4维数据转换成了2维数据)。
在这里插入图片描述

4.2 卷积层的实现

im2col接口:

im2col (input_data, filter_h, filter_w, stride=1, pad=0)
• input_data―由(数据量,通道,高,长)的4维数组构成的输入数据
• filter_h―滤波器的高
• filter_w―滤波器的长
• stride―步幅
• pad―填充
卷积层代码实现:

class Convolution:
	 def __init__(self, W, b, stride=1, pad=0):
		 self.W = W
		 self.b = b
		 self.stride = stride
		 self.pad = pad
	 def forward(self, x):
		 FN, C, FH, FW = self.W.shape
		 N, C, H, W = x.shape
		 out_h = int(1 + (H + 2*self.pad - FH) / self.stride)
		 out_w = int(1 + (W + 2*self.pad - FW) / self.stride)
		 col = im2col(x, FH, FW, self.stride, self.pad)
		 col_W = self.W.reshape(FN, -1).T # 滤波器的展开
		 out = np.dot(col, col_W) + self.b
		 out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
		 return out

用im2col展开输入数据,并用reshape将滤波器展开为2维数组。

4.3 池化层的实现

池化的应用区域按通道单独展开。
在这里插入图片描述
代码实现:

class Pooling:
	 def __init__(self, pool_h, pool_w, stride=1, pad=0):
		 self.pool_h = pool_h
		 self.pool_w = pool_w
		 self.stride = stride
		 self.pad = pad
	 def forward(self, x):
		 N, C, H, W = x.shape
		 out_h = int(1 + (H - self.pool_h) / self.stride)
		 out_w = int(1 + (W - self.pool_w) / self.stride)
		 # 展开(1)
		 col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)
		 col = col.reshape(-1, self.pool_h*self.pool_w)
		 # 最大值(2)
		 out = np.max(col, axis=1) #。np.max可以指定axis参数,并在这个参数指定的各个轴方向上求最大值。np.max(x, axis=1):在输入x的第1维的各个轴方向上求最大值。
		 # 转换(3)
		 out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)
		 return out

5、 CNN的实现

参数:
• input_dim―输入数据的维度:(通道,高,长)
• conv_param―卷积层的超参数(字典)。字典的关键字如下:
filter_num―滤波器的数量
filter_size―滤波器的大小
stride―步幅
pad―填充
• hidden_size―隐藏层(全连接)的神经元数量
• output_size―输出层(全连接)的神经元数量
• weitght_int_std―初始化时权重的标准差
代码实现:

6、具有代表性的CNN

6.1 LeNet

在这里插入图片描述
LeNet VS CNN

  • LeNet中使用sigmoid函数,而现在的CNN中主要使用ReLU函数。
  • 原始的LeNet中使用子采样(subsampling)缩小中间数据的大小,而现在的CNN中Max池化是主流。
6.2  AlexNet

在这里插入图片描述
•激活函数使用ReLU。
• 使用进行局部正规化的LRN(Local Respons Normalization)层。
• 使用Dropout。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习之卷神经网络(CNN)详解与代码实现(一) 卷神经网络(CNN)是深度学习领域中应用广泛的一种神经网络,它通过卷、池化等操作,能够有效地处理图像、语音、文本等数据类型。本文将从卷神经网络的基本原理、结构、训练方法等方面进行详细介绍,并通过代码实现,加深读者对卷神经网络的理解。 一、卷神经网络的基本原理 卷神经网络(CNN)的基本原理是通过卷操作对输入数据进行特征提取,然后通过全连接层对特征进行分类或回归。卷操作是CNN的核心,它可以有效地减少网络中的参数数量,提高模型的泛化能力。 卷操作是指将一个卷核(kernel)与输入数据进行卷运算,得到一个特征图(feature map)。卷核是一个小的矩阵,可以通过学习得到,它的作用是对输入数据进行特征提取。卷操作可以提取出输入数据中的局部特征,不同的卷核可以提取出不同的特征,从而实现对输入数据的特征提取。 二、卷神经网络的结构 卷神经网络的结构包括卷层、池化层、全连接层等。其中卷层和池化层是CNN的核心,全连接层用于分类或回归。 1. 卷层 卷层是CNN中最重要的层之一,它的作用是对输入数据进行特征提取。卷层的参数包括卷核的大小、深度、步长等,其中卷核的大小和深度是最重要的参数。 卷层的输入是一个四维张量,分别表示样本数量、图像高度、图像宽度、图像通道数。卷核是一个三维张量,分别表示卷核的高度、宽度、深度。 卷操作可以通过矩阵乘法实现,也可以通过FFT等方法实现,但是前者的方法在卷核较小时速度较慢,后者在卷核较大时速度较慢。 2. 池化层 池化层是CNN中另一个重要的层,它的作用是对卷层的输出进行降维和特征提取。池化操作可以通过最大池化、平均池化等方法实现。最大池化是指在一个池化区域内选取最大的值作为池化结果,平均池化是指在一个池化区域内取平均值作为池化结果。 池化操作可以有效地减少数据的大小,提高模型的泛化能力。但是需要注意的是,过度的池化会导致信息的丢失,从而影响模型的性能。 3. 全连接层 全连接层是CNN中的最后一层,它的作用是将卷层和池化层的输出进行分类或回归。全连接层是一个标准的神经网络,其中每个神经元都与前一层的所有神经元相连。 全连接层的输出可以通过softmax函数进行分类,也可以通过线性函数进行回归。 三、卷神经网络的训练方法 卷神经网络的训练方法与其他神经网络类似,主要包括前向传播和反向传播两个过程。前向传播是指将输入数据通过卷层、池化层、全连接层等一系列操作,得到最终的输出结果。反向传播是指将输出结果与真实标签进行比较,然后通过梯度下降等方法,不断调整网络参数,使得输出结果更加接近真实标签。 在训练过程中,需要注意的是,卷神经网络通常需要较长的训练时间和大量的训练数据,以便得到更好的性能。此外,还需要注意选择适当的优化算法、学习率、正则化等参数,以避免过拟合和欠拟合等问题。 四、代码实现 下面是一个简单的卷神经网络的代码实现,用于对手写数字进行分类。 ```python import tensorflow as tf # 加载数据 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train, x_test = x_train / 255.0, x_test / 255.0 # 定义模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值