卷积神经网络
从全连接层到卷积 - why conv
- 1.假设卷积层覆盖的局部区域 Δ=0 。在这种情况下,证明卷积内核为每组通道独立地实现一个全连接层
当 Δ \Delta Δ=0时,公式变化为:
[
H
]
i
,
j
,
d
=
∑
a
=
0
0
∑
b
=
0
0
∑
c
[
V
]
0
,
0
,
c
,
d
[
X
]
i
,
j
,
c
=
∑
c
[
V
]
c
,
d
[
X
]
i
,
j
,
c
[H]_{i,j,d} = \sum_{a=0}^{0} \sum_{b=0}^{0} \sum_{c} [V]_{0,0,c,d}[X]_{i,j,c} \\= \sum_{c} [V]_{c,d}[X]_{i,j,c}
[H]i,j,d=a=0∑0b=0∑0c∑[V]0,0,c,d[X]i,j,c=c∑[V]c,d[X]i,j,c
其中c为通道,每一个输出则是对输出元素位置对应的输入元素的按通道累加,也就是1*1卷积。
- 2.为什么平移不变性可能也不是好主意呢?
并不是所有场合都符合平移不变性的,视觉上所看到物体的形状纹理颜色都会收到背景的影响,当其平移后能够在一定程度上满足平移不变性时候,卷积神经网络才能较好的起作用,反之,则不能起到很好的作用。
- 当从图像边界像素获取隐藏表示时,我们需要思考哪些问题
1 图像尺寸会改变,需要考虑图像尺寸的保持
2 需要padding吗,需要多大的padding
- 描述一个类似的音频卷积层的架构
音频是一维数据,可能类似于局部全连接?
- 卷积层也适合于文本数据吗?为什么?
不适合,文本数据受到语境的影响很大。即理解到的意思一定程度上取决于上下文。
图像卷积-conv-layer
- 构建一个具有对角线边缘的图像X
A 如果将本节中举例的卷积核K应用于X,会发生什么情况
会检测出多像素宽度的边缘,具体实现如下:
import torch
X = torch.eye(6)
K = torch.tensor([[1, -1]])
def corr2d(X, K):
y = torch.zeros((X.shape[0] - K.shape[0] + 1, X.shape[1] - K.shape[1] +1))
for i in range(y.shape[0]):
for j in range(y.shape[1]):
y[i, j] = ((X[i:i+K.shape[0], j:j+K.shape[1]])*K).sum()
return y
y = corr2d(X, K)
print(y)
"""
tensor([[ 1., 0., 0., 0., 0.],
[-1., 1., 0., 0., 0.],
[ 0., -1., 1., 0., 0.],
[ 0., 0., -1., 1., 0.],
[ 0., 0., 0., -1., 1.],
[ 0., 0., 0., 0., -1.]])
"""
B 如果转置X会发生什么?
仍旧可以检测出边缘
如果转置K会发生什么?
检测的结果会发生转置
-
如何通过改变输入张量和卷积核张量,将互相关运算表示为矩阵乘法?
拉伸每一个输出元素所对应的输入张量的对应元素。
填充和步幅-padding-and-strides
-
对于音频信号,步幅 2 说明什么
等价于2倍下采样。 -
步幅大于 1 的计算优势是什么?
降低计算复杂度,减轻存储和计算压力。
多输入多输出通道
-
假设我们有两个卷积核,大小分别为 𝑘1 和 𝑘2
A 证明运算可以用单次卷积来表示。
B 这个等效的单个卷积核的维数是多少呢
( k 1 − 1 ) + k 2 (k_1-1)+k_2 (k1−1)+k2 -
假设输入为 𝑐𝑖×ℎ×𝑤 ,卷积核大小为 𝑐𝑜×𝑐𝑖×𝑘ℎ×𝑘𝑤 ,填充为 (𝑝ℎ,𝑝𝑤) ,步幅为(𝑠ℎ,𝑠𝑤)
A 前向传播的计算成本
乘法: c 0 ∗ c i ∗ ( ( ( h + p h − k h ) / S h ) + 1 ) ( ( ( w + p w − k w ) / s w ) + 1 ) ∗ k h ∗ k w c_0 *c_i *(((h+p_h-k_h)/S_h)+1)(((w+p_w-k_w)/s_w)+1) *k_h*k_w c0∗ci∗(((h+ph−kh)/Sh)+1)(((w+pw−kw)/sw)+1)∗kh∗kw
加法: c 0 ∗ c i ∗ ( ( ( h + p h − k h ) / S h ) + 1 ) ( ( ( w + p w − k w ) / s w ) + 1 ) ∗ ( k h ∗ k w − 1 ) c_0 *c_i *(((h+p_h-k_h)/S_h)+1)(((w+p_w-k_w)/s_w)+1) *(k_h*k_w-1) c0∗ci∗(((h+ph−kh)/Sh)+1)(((w+pw−kw)/sw)+1)∗(kh∗kw−1) (这里没有考虑偏执)
内存占用是多少?
参数占用: c o ∗ ( c i ∗ k h ∗ k w + 1 ) c_o*(c_i*k_h*k_w+1) co∗(ci∗kh∗kw+1)
输入特征图: 𝑐 i ∗ h ∗ 𝑤 𝑐_i*ℎ*𝑤 ci∗h∗w
输出特征图: c o ∗ ( ( ( h + p h − k h ) / S h ) + 1 ) ( ( ( w + p w − k w ) / s w ) + 1 ) c_o*(((h+p_h-k_h)/S_h)+1)(((w+p_w-k_w)/s_w)+1) co∗(((h+ph−kh)/Sh)+1)(((w+pw−kw)/sw)+1)
反向传播的内存占用是多少?
反向传播的计算成本是多少? -
如果我们将输入通道 𝑐𝑖 和输出通道 𝑐𝑜 的数量加倍,计算数量会增加多少?如果我们把填充数量翻一番会怎么样
通道翻倍则计算量翻倍,填充增加则是线性增长复杂度。
-
如果卷积核的高度和宽度是 𝑘ℎ=𝑘𝑤=1 ,前向传播的计算复杂度是多少?
o ( c i ∗ c o ∗ h ∗ w ) o(c_i*c_o*h*w) o(ci∗co∗h∗w) -
本节最后一个示例中的变量Y1和Y2是否完全相同?为什么?
不会 精度问题。
pooling
你能将平均汇聚层作为卷积层的特殊情况实现吗?
import torch
import torch.nn as nn
in_channel, out_channel = 1, 1
padding = 2
avg_pooling = nn.Conv2d(kernel_size=2, in_channels=in_channel, out_channels=out_channel, padding=0,stride=padding,bias=False)
nn.init.constant_(avg_pooling.weight, 1/4)
print(avg_pooling.weight)
X = torch.range(start=1, end=16).reshape((1,1,4, 4))
y = avg_pooling(X)
print(y)
'''
Parameter containing:
tensor([[[[0.2500, 0.2500],
[0.2500, 0.2500]]]], requires_grad=True)
tensor([[[[ 3.5000, 5.5000],
[11.5000, 13.5000]]]], grad_fn=<ConvolutionBackward0>)
'''
你能将最大汇聚层作为卷积层的特殊情况实现吗?
假设汇聚层的输入大小为 𝑐×ℎ×𝑤 ,则汇聚窗口的形状为 𝑝ℎ×𝑝𝑤 ,填充为 (𝑝ℎ,𝑝𝑤) ,步幅为 (𝑠ℎ,𝑠𝑤) 。这个汇聚层的计算成本是多少?
c ∗ ( ( h + p h − p h ) / s h + 1 ) ∗ ( ( w + p w − p w ) / s w + 1 ) ∗ ( p h ∗ p w − 1 + 1 ) c*((h+p_h-p_h)/s_h + 1 )*((w+p_w-p_w)/s_w + 1 )*(p_h*p_w-1 +1) c∗((h+ph−ph)/sh+1)∗((w+pw−pw)/sw+1)∗(ph∗pw−1+1) -1是加法个数 后面+1是除法个数
为什么最大汇聚层和平均汇聚层的工作方式不同?
一个是找最大的元素,更侧重于检测响应大的点,求均值则会在一定程度上进行空间位置的融合。
我们是否需要最小汇聚层?可以用已知函数替换它吗?
最小汇聚层指的是最小响应的值?这样会造成信息大量丢失?
除了平均汇聚层和最大汇聚层,是否有其它函数可以考虑(提示:回想一下softmax)?为什么它不流行?
softmax需要学习参数且计算复杂