目录
习题5-5 对于一个二维卷积, 输入为3 × 3, 卷积核大小为2 × 2, 试将卷积操作重写为仿射变换的形式. 参见公式(5.45) .
附加题 阅读 “5.3.1 卷积神经网络的反向传播算法”,举例说明推导过程.
习题 5-7 忽略激活函数, 分析卷积网络中卷积层的前向计算和反向传播(公式(5.39)) 是一种转置关系.
习题5-8 在空洞卷积中, 当卷积核大小为𝐾, 膨胀率为𝐷时, 如何设置零填充𝑃 的值以使得卷积为等宽卷积 .
习题5-2 证明宽卷积具有交换性, 即公式(5.13).
首先了解一下知识背景和定义:邱锡鹏《神经网络与深度学习》p144
了解了宽卷积(Wide Convolution)的定义后(5.12)式,验证(5.13)式:
通过计算,结果相同,即
得证,宽卷积具有交换性。
(留个眼,尝试使用代码手动卷积 运算一下,由于技艺不够,后续补上这段代码QAQ):
import torch
import numpy as np
import torch.nn as nn
rot_X = np.array([
[16.0 ,15.0,14.0,13.0],
[12.0 ,11.0,10.0,9.0],
[8.0 ,7.0 ,6.0 ,5.0],
[4.0 ,3.0 ,2.0 ,1.0]
])
rot_X = torch.from_numpy(rot_X)
print('rot_X为:','\n',rot_X,rot_X.shape)
rot_W = np.array([
[4.0 ,3.0],
[2.0 ,1.0]
])
rot_W = torch.from_numpy(rot_W)
print('rot_W为:','\n',rot_W,rot_W.shape)
X_ = np.array([
[1.0 ,2.0,3.0,4.0],
[5.0 ,6.0,7.0,8.0],
[9.0,10.0,11.0,12.0],
[13.0,14.0,15.0,16.0]
])
X_ = torch.from_numpy(X_)
pad_1 = nn.ZeroPad2d(padding=(1)) #在上下左右分别填充1行/列零
X_ = pad_1(X_)
print('X_为:','\n',X_)
W_ = np.array([
[1.0 ,2.0],
[3.0 ,4.0]
])
W_ = torch.from_numpy(W_)
pad_1 = nn.ZeroPad2d(padding=(3)) #在上下左右分别填充3行/列零
W_ = pad_1(W_)
print('W_为:','\n',W_)
#定义完成,,进行卷积运算
不失一般性,证明:(后续会手写一遍,补上)
【NNDL作业】 宽卷积具有交换性_卷积交换律公式证明_HBU_David的博客-CSDN博客
习题5-4 对于一个输入为100 × 100 × 256的特征映射组, 使用3 × 3的卷积核, 输
出为100 × 100 × 256的特征映射组的卷积层, 求其时间和空间复杂度. 如果引入
一个1 × 1卷积核, 先得到100 × 100 × 64的特征映射, 再进行3 × 3的卷积, 得到
100 × 100 × 256的特征映射组, 求其时间和空间复杂度.
首先感谢这篇博客提供了思路:
卷积神经网络复杂度分析(时间复杂度,空间复杂度)_卷积的空间复杂度-CSDN博客
单个卷积层的时间复杂度:Time~O(M^2 * K^2 * Cin * Cout)
单个卷积层的空间复杂度:Space~O(K^2 * Cin * Cout)
(另有其他版本的空间复杂度计算公式为:Space~O(K^2 * Cin * Cout+M^2*Cout) )
M:输出特征图(Feature Map)的尺寸。
K:卷积核(Kernel)的尺寸。
Cin:输入通道数。
Cout:输出通道数。
第1问:
输入特征映射组:100*100*256 ; 卷积核:3*3 ; 输出特征映射组:100*100*256
参数值为: M = 100 K=3 Cin=256 Cout=256
第2问:
Cin_1 = 256 Cout_1 = 64
Cin_2 =64 Cout_2 = 256
K1=1 K2=3 M=100
接:
昨天昨晚这道题后,在知乎文章上看到了更详细的解答方法,首先放上公式:
与我在上面使用的计算公式的不同为:空间复杂度计算公式多了一项,那么我根据新发现的公式重新计算空间复杂度:
习题5-5 对于一个二维卷积, 输入为3 × 3, 卷积核大小为2 × 2, 试将卷积操作重
写为仿射变换的形式. 参见公式(5.45) .
老师推荐的网站:CVPR2015: FCN - 知乎 (zhihu.com)
首先举例:假设conv layer的输入大小是4x4,kernel大小3x3,stride=1,padding=0,则output大小为2x2,计算机是以矩阵乘法的形式实现conv layer,将kernel转换为一个稀疏矩阵,将input拉伸为一个16维的向量,如下图所示:
其中左边的矩阵即为稀疏矩阵C,非零元素均来自于w卷积核中的元素。
邱锡鹏深度学习一书上的内容:
得到:
现在 仿照老师所给出的网站中的图,可以得到如下:intput为3*3 , kernel为2*2 ,output的形状应为2*2。现将input压扁为9*1的向量,output压扁为4*1的向量,由此可以确定稀疏矩阵C的形状为4*9。
形状确定完成后,再往C里面填数了,填数结果如下:
填数的技巧(我个人使用的)是 首先在脑海里构思卷积核在input矩阵上卷积的过程,按照卷积的过程 如果w乘到了x,那么就在稀疏矩阵对应的x的拉伸过后的位置上填写上w,如果x未被w卷积到,就填0 . 这样说还是有点抽象,我尝试做个动态图展示一下过程(也可能录个视频,再留个眼)
附加题 阅读 “5.3.1 卷积神经网络的反向传播算法”,举例说明推导过程.
(太难了,一遇到公式推导我就害怕了,自己照着书本推了很久还是处于懵懵懂懂的状态,去B站听了几节课,也只能知道大概的流程。一旦真正的上手推,我就没有耐心了,很多很多符号和矩阵乘法叠在一起 。 索性只能借鉴了大佬的博客,来了解一下基本过程)
反向传播算法推导-卷积神经网络 - 知乎 (zhihu.com)
卷积层:
首先推导卷积层的反向传播计算公式。正向传播时,卷积层实现的映射为:
我们用前面的这个例子来进行计算:
卷积输出图像的任意一个元素都与卷积核矩阵的任意一个元素都有关,因为输出图像的每一个像素值都共用了一个卷积核模板。反向传播时需要计算损失函数对卷积核以及偏置项的偏导数,和全连接网络不同的是,卷积核要作用于同一个图像的多个不同位置。
上面的描述有些抽象,下面我们用一个具体的例子来说明。假设卷积核矩阵为:
输入图像是:
卷积之后产生的输出图像是U,注意这里只进行了卷积、加偏置项操作,没有使用激活函数:
正向传播时的卷积操作为:
反向传播时需要计算损失函数对卷积核以及偏置项的偏导数,和全连接网络不同的是,卷积核要反复作用于同一个图像的多个不同位置。根据链式法则,损失函数对第l层的卷积核的偏导数为:
池化层
反向传播算法推导-卷积神经网络 - 知乎 (zhihu.com)
致敬大佬
习题 5-7 忽略激活函数, 分析卷积网络中卷积层的前向计算和反向传播(公式
(5.39)) 是一种转置关系.
以一个3×3的卷积核为例,输入为X输出为Y:
将4×4的输入特征展开为16×1的矩阵,y展开为4×1的矩阵,将卷积计算转化为矩阵相乘
由于
得到
所以
得证 前向计算和反向传播是一种转置关系。
习题5-8 在空洞卷积中, 当卷积核大小为𝐾, 膨胀率为𝐷时, 如何设置零填充𝑃 的
值以使得卷积为等宽卷积 .
空洞卷积运行示意图:空洞卷积(膨胀卷积)的相关知识以及使用建议(HDC原则)_膨胀卷积和空洞卷积-CSDN博客
kernel_size = 3, dilated_ratio = 2, stride = 1, padding = 0
膨胀卷积的作用:1.增大感受野;2.保持原输入特征图的高度和宽度
空洞卷积核的有效大小为:
等宽卷积则意味着特征图卷积完后尺寸不发生变化,则有:
这次的作业 公式推导部分难度太大了,我琢磨了好久,还是做不出来,也许是自己的数学天赋值为负吧,每次遇到公式推导就非常的头疼...
还有 这次的作业还有很多需要改进的地方,我都一一留下了标记,一定会改进的,老师说过作业一定要保证质量,我会铭记在心的((*^_^*))。
本篇博客引用的优秀内容链接如下,在此鸣谢:
CVPR2015: FCN - 知乎 (zhihu.com)
【NNDL作业】 宽卷积具有交换性_卷积交换律公式证明_HBU_David的博客-CSDN博客
反向传播算法推导-卷积神经网络 - 知乎 (zhihu.com)
空洞卷积(膨胀卷积)的相关知识以及使用建议(HDC原则)_膨胀卷积和空洞卷积-CSDN博客
总结-空洞卷积(Dilated/Atrous Convolution) - 知乎 (zhihu.com)
卷积神经网络复杂度分析(时间复杂度,空间复杂度)_卷积的空间复杂度-CSDN博客
【NNDL作业】 宽卷积具有交换性_卷积交换律公式证明_HBU_David的博客-CSDN博客
【精选】NNDL 作业7:第五章课后题(1×1 卷积核 | CNN BP)_神经网络与深度神经网络邱锡鹏答案第五章-CSDN博客
【精选】NNDL 作业7:第五章课后题(1×1 卷积核 | CNN BP)-CSDN博客
【23-24 秋学期】NNDL 作业8 卷积 导数 反向传播-CSDN博客