1 网络
1.1 AlexNet
1.1.1 局部响应归一化层(lrn层)
lrn公式:用a除以临近卷积核在对应位置提取到的特征之和
b
x
,
y
i
=
a
x
,
y
i
/
(
k
+
α
∗
∑
j
=
m
a
x
(
0
,
i
−
n
/
2
)
m
i
n
(
N
−
1
,
i
+
n
/
2
)
(
a
x
,
y
j
)
2
)
β
b_{x,y}^{i} = a_{x,y}^{i}/\left ( k+\alpha *\sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)} (a_{x,y}^{j})^{2} \right )^{\beta}
bx,yi=ax,yi/⎝⎛k+α∗j=max(0,i−n/2)∑min(N−1,i+n/2)(ax,yj)2⎠⎞β
i表示第i个核在位置(x,y)运用激活函数ReLU后的输出,n是同一位置上临近的kernal map的数目,N是kernal的总数参数,K,n,alpha,belta都是超参数,一般设置k=2,n=5,aloha=1*e-4,beta=0.75
lrn层的解析:抑制相邻神经元,平滑图像,增强泛化能力,后来被更有说服力的BN取代.
[1] 深度学习的局部响应归一化LRN(Local Response Normalization)理解
[2] LRN ( Local Response Normalization) 局部响应归一化层
[3] 如何区分并记住常见的几种 Normalization 算法
1.5 DenseNet
1.5.1 和ResNet区别
DenseNet拼接不同层的特征图(torch.cat([x, new_features], 1)
),而ResNet直接元素相加.
1.5.2 DenseNet的concat操作
对图像分布信息更匹配(而ResNet更通用化),但也正是因为不断地concat容易造成显存过大,它没有流行起来,也因此它的场景更适合分辨率低的图像
参考: DenseNet
2 实践部分
2.1.1 np和tf的api使用
(1) 总的通道数目(它是人为设置的数目):单个卷积核和输入图像的通道数相等, 参考: 【CNN】理解卷积神经网络中的通道 channel
(2) tf.nn.max_pool中stride的参数:A 4-dim tensor has shape [batch, height, width,channel],第一个为批量数(图片数目),第四个参数为通道数目(RGB为三个通道),常常是处理一张图片一个通道,所以这两个参数常常设置为1
github issues解决方案
(3) np中clip(x, a_min, a_max)中,把若x<a_min就x=a_min,若x>a_max就x=a_max
(4) Dataset.map(f), f传进和返回的都是单个元素的tf.tensor对象
(5) prefetch预先载入元素放到缓存中减少等待
(6) tf.cast把图像数据转化为float32(一般情况下)
(7) tf.argmax(input, 1), 返回最大值的索引(1为行,0为列)
(8) np.floor把小数返回到它们接近的最大整数
(9) tf.expand_dims(t, n)增加一维度, n为位置,
(10) tf.concat(),维度越高括号越小,拼接哪个维度就是拿掉哪个维度的括号
参考: tf.concat()详解
2.1.2 torch的api使用
(1) torch是以[n, c, h, w]保存图片的
(2) torch.cat([A, B], n), n为按第n个维度拼接
2.2 常见bug
(1) 解决No module named 'tensorflow.data
(2) shape注意检查,(如图像的resize,通道数目)
2.3 微调和预训练
(1) 预训练: 就是在之前训练的模型基础上再训练,网络每一层都会训练
(2) 微调: 训练后面几层(如全连接层)