动量
无动量梯度更新
添加动量影响后的梯度更新
这里都是矢量运算,也就是不仅仅之前的梯度大小会影响现在的梯度大小,之前的梯度方向也会影响现在的梯度方向。
如图分别表示没有和有动量参与的梯度更新
学习率衰减
学习率衰减带来的训练效果增强
lr监听方案一
optimizer = torch.optim.SGD(model.parameters(),args.lr,
momentum=args.momentum, # Adam 没有这个参数,因为它内置了默认的动量
weight_decay=args.weight_decay)
# reduce learning rate on plateau 在高原减少学习率
# 传入optimizer是把学习率给scheduler管理
scheduler = ReduceLROnPlateau(optimizer,'min')
for epoch in xrange(args.start_epoch,args.epochs):
tarin(train_loader,model,criterion,optimizer,epoch)
result_avg,loss_val = validate(val_loader,model,criterioni,epoch)
scheduler.step(loss_val) # 监听loss 如果连续10个(虚指)epoch loss没有减少,就会把lr按规则衰减
lr监听方案二
scheduler = StepLR(optimizer,step_size=30,gamma=0.1) # 简单粗暴 30个epoch衰减为原来的0.1
for epoch in range(100):
scheduler.step()
train(...)
validate(...)
early stopping
依靠交叉验证数据集来判断何时early stopping,靠经验判断。
drop out
Dropout说的简单一点就是我们让在前向传导的时候,让某个神经元的激活值以一定的概率p,让其停止工作,示意图如下:
(https://blog.csdn.net/hjimce/article/details/50413257)
实现代码
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.model = nn.Sequential(
nn.Linear(784, 200),
nn.Dropout(0.1), # 10% 断掉
nn.LeakyReLU(inplace=True),
nn.Linear(200, 200),
nn.Dropout(0.1),
nn.LeakyReLU(inplace=True),
nn.Linear(200, 10),
nn.Dropout(0.1),
nn.LeakyReLU(inplace=True),
)
def forward(self, x):
x = self.model(x)
return x
pytorch和tensorFlow定义的一些区别
torch.nn.Dropout(p=dropout_prob) # 表示被去除的概率
tf.nn.dropout(keep_prob) # 被保留的概率
test阶段不存在drop out的说法