1.经过网络之后的图像大小计算:https://zhuanlan.zhihu.com/p/395354063
1.1 经过卷积
a
f
t
e
r
=
(
w
i
g
h
t
−
k
e
r
n
a
l
)
+
2
×
p
a
d
d
i
n
g
s
t
r
i
d
e
+
1
after = \frac{(wight - kernal) + 2\times padding}{stride} + 1
after=stride(wight−kernal)+2×padding+1
如果除不尽的话下取整
卷积核的个数为自己设定的
1.2 经过池化
a
f
t
e
r
=
w
i
g
h
t
−
k
e
r
n
a
l
s
t
r
i
d
e
+
1
after = \frac{wight - kernal}{stride} + 1
after=stridewight−kernal+1
除不尽下取整
卷积核前后不变
1.3 经过激活函数
不会改变图像shape
2. 网络的性能分析
https://zhuanlan.zhihu.com/p/395354063
2.1 参数分析
卷积层
参数 = 设定的通道数 × 卷积核的长 × 宽 × 原始的通道数 参数 = 设定的通道数 \times 卷积核的长 \times 宽 \times 原始的通道数 参数=设定的通道数×卷积核的长×宽×原始的通道数
全连接层
参数 = 输入向量个数 × 输出向量个数 + 偏置(输出向量个数) 参数 = 输入向量个数 \times 输出向量个数 + 偏置(输出向量个数) 参数=输入向量个数×输出向量个数+偏置(输出向量个数)
池化层
0
2.2 计算次数分析(只算乘法)
https://zhuanlan.zhihu.com/p/395354063
卷积层
计算次数 = 输入通道 × 输出通道 × 核长 × 核宽 × 输出图片长 × 输出图片宽 计算次数 = 输入通道\times 输出通道 \times 核长\times核宽\times输出图片长\times输出图片宽 计算次数=输入通道×输出通道×核长×核宽×输出图片长×输出图片宽
全连接
计算次数 = 输入向量个数 × 输出向量个数 计算次数=输入向量个数 \times 输出向量个数 计算次数=输入向量个数×输出向量个数
3.1 思考 为什么Maxpool 这么常用 而Minpool不常用呢
如果在relu之后使用minpool 所得的就为一堆0了
3.2 思考 Maxpool 和 Avgpool有什么区别
最大池化提取特征纹理
平均池化保留背景信息
4. *和**
* 的作用主要是将元组或者列表拆分成单个元素 如将[1, 2, 3] 拆分成为 1 2 3
**的作用主要是传参 如
dir = {'a':1, 'b':2, 'c':3}
foo(**dir)
foo(a = 1, b = 2, c = 3)
#以上两者等价
例子:vgg块
def vgg_block(num_convs, in_channels, out_channels):
layers = []
for _ in range(num_convs):
layers.append(nn.Conv2d(in_channels, out_channels,
kernel_size=3, padding=1))
layers.append(nn.ReLU())
in_channels = out_channels
layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
return nn.Sequential(*layers)
为*layers的原因是nn.Sequential需要的参数为layer[0], layer[1], layer[2], …
如果直接将列表传入,则出现错误