optimizer
作用
根据网络反向传播的梯度信息更新网络参数, 降低loss函数值
结构
-
优化器需要知道模型的参数空间, 因此需要训练前将网络参数放入优化器内
1 2
optimizer_G = Adam(model_G.parameters(), lr=train_c.lr_G) # lr 使用的是初始lr optimizer_D = Adam(model_D.parameters(), lr=train_c.lr_D)
-
需要知道反向传播的梯度信息
使用
optimizer.step()
函数, 对参数空间中的grad进行操作, 放在mini-batch内例如使用负梯度下降法
1 2 3 4 5 6
for p in group['params']: if p.grad is None: continue d_p = p.grad.data p.data.add_(-group['lr'], d_p)
注意:
-
使用前先清零
optimizer.zero_grad()
, 防止使用的这个grad就得同上一个mini-batch有关 -
跟在反向传播后面, 因为优化器更新参数需要基于反向梯度
1 2
loss.backward() # 反向传播 optimizer.step()
scheduler.step()
按照Pytorch的定义是用来更新优化器的学习率的,一般是按照epoch为单位进行更换,即多少个epoch后更换一次学习率,因而scheduler.step()放在epoch这个大循环下。 -
Loss
Cross Entropy Error Function(交叉熵损失函数)
t.nn.CrossEntropyLoss
1.表达式
(1) 二分类
在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 和 。此时表达式为:
其中: - —— 表示样本i的label,正类为1,负类为0 - —— 表示样本i预测为正的概率
(2) 多分类
多分类的情况实际上就是对二分类的扩展:
其中: - ——类别的数量; - ——指示变量(0或1),如果该类别和样本i的类别相同就是1,否则是0; - ——对于观测样本i属于类别 的预测概率。
例1:
例2:
可以发现,交叉熵损失函数可以捕捉到模型1和模型2预测效果的差异。
2. 函数性质
可以看出,该函数是凸函数,求导时能够得到全局最优值。
3. 学习过程
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:
- 神经网络最后一层得到每个类别的得分scores;
- 该得分经过sigmoid(或softmax)函数获得概率输出;
- 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。
学习任务分为二分类和多分类情况,我们分别讨论这两种情况的学习过程。
3.1 二分类情况
二分类交叉熵损失函数学习过程
如上图所示,求导过程可分成三个子过程,即拆成三项偏导的乘积:
可以看到,我们得到了一个非常漂亮的结果,所以,使用交叉熵损失函数,不仅可以很好的衡量模型的效果,又可以很容易的的进行求导计算。
缺点
sigmoid(softmax)+cross-entropy loss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等。
CNN知识点
Val模式
model.eval()
,model.train()
eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大
model.train() 和 model.eval() 一般在模型训练和评价的时候会加上这两句,主要是针对由于model 在训练时和评价时 Batch Normalization 和 Dropout 方法模式不同;因此,在使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval;
通道(channel)和特征图(feature map)
从卷积网络的构成部分来看:
-
池化过程中, 不会对通道间的交互有任何影响
-
卷积则可以进行通道之间的交互, 之后在下一层生成新的通道, 比如Incept-Net中大量1*1的卷积便只进行通道间的交互而不关心通道内的交互.
通道和特征图都可看做是之前输入上某个特征分布的数据, 两者本质上是相同的
物理意义:通道中某一处数值的强弱就是对当前特征强弱的反应。
Batch size, Epoch 和 iteration
1)iteration:表示1次迭代,每次迭代更新1次网络结构的参数,1个iteration等于使用batchsize个样本训练一次; (2)batch_size:批大小,即1次迭代所使用的样本量。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练; (3)epoch:1个epoch等于使用训练集中的全部样本训练一次。
Reference
$$
-
Previous
论文学习 Fuzzy c Means clustering with local information and kernel metric for image segmentation -
Next
神经网络-学习种类分类