深度学习之卷积神经网络

图像卷积

  1. 二维卷积计算

假设输入为一个高和宽均为3的二维数组例如

{(0,1,2)

(3,4,5)

(6,7,8)},

卷积层为一个2×2的二维数组,例如

{(0,1)

(2,3)}

在计算时卷积核窗口的形状取决于卷积核的高和宽。

那么输出Y也为一个与卷积核高和宽相同大小2×2的二维数组,

其中的元素通过二维互相关运算得出,在二维互相关运算中,卷积窗口遵循从左到右,从上往下的顺序。

0×0+1×1+3×2+4×3=19

1×0+2×1+4×2+5×3=25

3×0+4×1+6×2+7×3=37

4×0+5×1+7×2+8×3=43

最终结果输出Y为

{(19,25)

(37,43)}

  1.  构建卷积计算代码

def corr2d(X, K):

    h, w = K.shape

    X, K = X.float(), K.float()

    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))

    for i in range(Y.shape[0]):

        for j in range(Y.shape[1]):

            Y[i, j] = (X[i: i + h, j: j + w] * K).sum()

    return Y

这段代码定义了卷积计算的基本操作,X表示输入的二维张量,K表示卷积核,首先是通过h,w=K.shape来获取卷积核的高度与宽度。X,K=X.float(),K.float()将输入矩阵X和卷积核K转换成浮点类型。

Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))则是创建了一个全零矩阵用来存储计算结果。然后通过for循环来计算输出矩阵Y中第(i, j)位置的元素。该元素是输入矩阵X的子矩阵和卷积核K对应位置元素的乘积之和。

  1.  自定义构建二维卷积层

二维卷积层在进行卷积计算的基础上加上了权重参数weight和偏置参数。

该卷积层的init方法接受一个kernel_size下参数,用于指定卷积核的大小,在初始化过程使用nn.Parameter函数创建了两个参数weight与bias。

   def forward(self, x):

        return corr2d(x, self.weight) + self.bias

最后使用了forward函数将输入张量x作为参数,调用corr2d函数来计算输入张量x与卷积核的卷积结果,最后将卷积结果与偏置项相加,并返回最终结果。

  1. 图像中的物体边缘检测

我们可以利用卷积计算来进行图像边缘的检测。

假设一个6×8图像:

构建一个高和宽分别为1,2的卷积核

K = torch.tensor([[1, -1]])

在计算时如果横向相邻元素相同,输出为0;否则输出为非0,因此可以检测出边缘变化。

进行卷积计算得到结果:

3.2多输入和多输出通道

  1. 多输入通道

原理:

在第一个实验时进行的输入通道为1,但是现在我们要进行多输入通道,即通道数大于1,因此在构建卷积核时要构造一个与输入通道数相同的卷积核,来进行互相关运算。

如图,在进行多输入通道的计算时,要分别计算同一通道下的输入与卷积核的运算最后将两个通道的结果相加

如:56=(1*1+2*2+4*3+5*4)+(0*0+1*1+3*2+4*3)

在构建多输入通道函数时通过分别遍历X和K的第0个维度(即通道维度),并对每个通道进行二维互相关运算,然后把所有通道的结果相加。对于每一个通道,函数调用d2l.corr2d(x, k)来计算该通道上的二维互相关运算结果。最终,函数通过sum()函数将所有通道的结果相加,并返回总的结果。

2.多输出通道

当多通道输入时,我们给各个通道的结果做了累加,所以输出通道总为1,在进行多输出通道的实现时可以构建多连结的卷积核。

K = torch.stack([K, K + 1, K + 2])

  1. shape

构建了一个输出通道数为3的卷积核。

然后构建函数:

def corr2d_multi_in_out(X, K):

    # 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。

    # 最后将所有结果都叠加在一起

return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

对输入X与卷积核K进行卷积计算就可以得到了三输出通道的结果。

3.3卷积神经网络

1.数据准备:我们使用了一个数据迭代器train_iter和test_iter来分别表示训练集和测试集的数据。

  1. 模型定义:我们使用了一个预先定义好的卷积神经网络模型net,包括卷积层、池化层和全连接层等。

整个网络的结构可以表示为:

输入 -> 卷积层 -> Sigmoid激活函数 -> 池化层 -> 卷积层 -> Sigmoid激活函数 -> 池化层 -> 展平层 -> 全连接层 -> Sigmoid激活函数 -> 全连接层 -> Sigmoid激活函数 -> 输出

nn.Conv2d(1, 6, kernel_size=5, padding=2):第一层卷积层,输入通道数为1,输出通道数为6,使用5x5大小的卷积核进行卷积操作,padding参数为2表示在输入的边缘周围填充2个像素。nn.Sigmoid():激活函数层,通过Sigmoid函数将卷积层的输出进行非线性映射,引入非线性特征。nn.Conv2d(6, 16, kernel_size=5):第二层卷积层,输入通道数为6,输出通道数为16,使用5x5大小的卷积核进行卷积操作。nn.Linear(16 * 5 * 5, 120):全连接层,输入大小为16 * 5 * 5,输出大小为120。nn.Sigmoid():激活函数层,对全连接层的输出进行非线性映射。

3.GPU设置:我们调用d2l.try_gpu()函数将模型移动到可用的GPU设备上。

4.训练参数设置:我们将学习率(lr)设置为0.9,训练轮次(num_epochs)设置为10。

5.训练过程:我们调用train_ch6函数来对模型进行训练。该函数会初始化权重、创建优化器和损失函数等,并使用SGD优化器和交叉熵损失函数对模型进行训练。在每个训练轮次结束后,它会计算模型在测试集上的准确率,并将结果添加到可视化对象中进行展示。

小结:

本次我介绍了如何掌握二维卷积计算,多输入通道卷积计算以及多输出卷积计算的原理与计算方法,以及如何用代码构建函数来进行卷积计算,最后在进行构建卷积神经网络来进行图像识别的方法,学到了如何具体构建卷积神经网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值