212_视觉处理的基石:深入浅出卷积层(Convolutional Layer)
在处理图像时传统的全连接网络MLP会将图像展平这会丢失空间位置信息。卷积层则不同它像一个“放大镜”在图像上滑动提取局部特征。1. 为什么图像需要卷积平移不变性不管猫在图片的左上角还是右下角模型都应该能识别出它是猫。局部性图像的一个像素通常只与其周围的像素相关不需要和相距很远的像素进行全连接计算。2. 核心概念互相关运算 (Cross-Correlation)虽然数学上称为“卷积”但在深度学习框架如 PyTorch中我们实现的通常是互相关运算。输入 (Input)二维图像矩阵。核 (Kernel/Filter)一个小矩阵如代表要提取的特征。输出 (Feature Map)卷积后的结果。计算逻辑核在输入上滑动对应元素相乘再求和得到输出中的一个元素。Pythonimport torch from torch import nn def corr2d(X, K): 计算二维互相关运算 h, w K.shape 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 torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]) K torch.tensor([[0.0, 1.0], [2.0, 3.0]]) print(corr2d(X, K))3. 实战通过卷积检测图像边缘文件展示了一个非常直观的例子利用卷积核找到图像中颜色变化的边界。Python# 1. 构造一个 6x8 的黑白图像中间为黑(0)两边为白(1) X torch.ones((6, 8)) X[:, 2:6] 0 # 2. 定义一个 1x2 的卷积核用来检测垂直边缘 # 如果相邻两个像素相同输出为 0如果不同输出为 1 或 -1 K torch.tensor([[1.0, -1.0]]) # 3. 进行卷积 Y corr2d(X, K) print(Y) # 输出中非零值的位置就是边缘所在4. 学习卷积核让模型自己找特征在真实的神经网络中我们不需要手动设计。我们会随机初始化然后通过反向传播让模型自动“学”出最适合提取特征的数值。Python# 构造一个具有单个输出通道和形状为 (1, 2) 的卷积层 conv2d nn.Conv2d(1, 1, kernel_size(1, 2), biasFalse) # 增加批量维和通道维 X X.reshape((1, 1, 6, 8)) Y Y.reshape((1, 1, 6, 7)) # 迭代训练 for i in range(10): Y_hat conv2d(X) l (Y_hat - Y) ** 2 # 均方误差 conv2d.zero_grad() l.sum().backward() # 梯度下降更新权重 conv2d.weight.data[:] - 3e-2 * conv2d.weight.grad if (i 1) % 2 0: print(fbatch {i1}, loss {l.sum():.3f}) # 查看学习到的卷积核 print(f学习到的核: {conv2d.weight.data.reshape((1, 2))})5. 卷积层的三大要素感受野 (Receptive Field)输出中的一个元素对应输入中多大的区域。填充 (Padding)在图像四周补 0防止输出图像越卷越小。步幅 (Stride)核每次滑动的距离步幅越大输出图像分辨率越低。 学习小结卷积层是计算机视觉的“眼睛”。通过本节你理解了卷积是如何将复杂的图像简化为特征信号的。掌握了nn.Conv2d你就拿到了通往 LeNet、ResNet 等经典视觉模型的入场券。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2493514.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!