深度学习-卷积层(2)

一、简介
在本章中,我们展示了一种将卷积运算转换为矩阵乘法的方法。 这样的优点是计算速度更快,但会占用更多的内存。 我们使用im2col运算将输入图像或批处理转换为矩阵,然后将该矩阵与内核的重塑版本相乘。 然后最后,我们使用col2im操作将这个相乘后的矩阵重塑为图像。

二、Im2col
如先前的源代码所示,我们使用了很多for循环来实现卷积,尽管这对于学习很有用,但速度不够快。 在本节中,我们将学习如何以向量化方式实现卷积。首先,如果我们仔细检查,卷积代码基本上就是内核过滤器和移动窗口选择的局部区域之间的点积,从而对与我们的内核大小相同的补丁进行采样。如果我们扩展内存上所有可能的窗口并将点积作为矩阵乘法执行,将会发生什么。 回答200倍或更多的加速比,以更多的内存消耗为代价。
在这里插入图片描述

例如,如果输入为[227x227x3],并且要在第4步和填充0处与11x11x3滤镜进行卷积,则我们将在输入中采用[11x11x3]个像素块,并将每个块拉伸为size =的列向量 363。
使用步幅为4且填充为0的输入227进行计算,得出沿宽度和高度的((227-11)/ 4)+1 = 55个位置,从而得到大小为[363 x 3025]的输出矩阵X_col。
在这里,每列都是一个扩展的接收场(带有深度的色块),总共有55 * 55 = 3025。
总结一下我们如何计算im2col输出大小:
[img_height, img_width, img_channels] = size(img);
newImgHeight = floor(((img_height + 2P - ksize) / S)+1);
newImgWidth = floor(((img_width + 2
P - ksize) / S)+1);
cols = single(zeros((img_channelsksizeksize),(newImgHeight * newImgWidth)));

CONV层的权重类似地延伸成行。 例如,如果有96个大小为[11x11x3]的滤镜,这将给出大小为[96 x 363]的矩阵W_row,其中11x11x3 = 363:
在这里插入图片描述

在将图像和内核进行转换之后,可以将卷积实现为简单的矩阵乘法,在我们的示例中,将W_col [96 x 363]乘以X_col [363 x 3025]得出矩阵[96 x 3025], 需要重新调整为[55x55x96]。最后的重塑也可以实现为称为col2im的函数。请注意,im2col的某些实现将转置此结果,如果是这种情况,则必须更改矩阵乘法的顺序。
在这里插入图片描述

正向图
为了帮助将im2col与卷积配合使用并导出反向传播,让我们以im2col作为图来展示卷积。 在这里,输入张量是一个3通道4x4图像。 这将传递到具有S:1 P:0 K:2和F:1(输出量)的卷积层。
在这里插入图片描述

后向图
使用im2col技术,计算图类似于具有相同格式的FC层,区别在于现在我们有一堆重塑,转置和im2col块。关于反向传播期间的重塑和转置,您只需要再次使用另一种重塑或转置来反转其操作,唯一要记住的是,如果在正向传播期间使用重塑行主音,则需要在 反向传播。需要注意的唯一一点是im2col反向传播操作。 问题在于它不能实现为简单的重塑。 这是因为面片实际上可能重叠(取决于步幅),因此您需要对面片相交处的梯度求和。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值