一.优化器
1.参数
optimizer = torch.optim.Adam(params,lr)
- params:被优化的参数,通常为 model.parameters()
- lr:学习率
- 其余参数:不同的优化器有不同的具体参数
2.常用优化器
torch.optim.Adadelta()
torch.optim.Adagrad()
torch.optim.Adam()
torch.optim.Adamax()
torch.optim.ASGD()
torch.optim.LBFGS()
torch.optim.RMSprop()
torch.optim.Rprop()
torch.optim.SGD()
3.学习率的设置方式
(1).所有网络层有相同的学习率
optimizer = Adam(testnet.parameters(),lr=0.001)
(2).不同网络层有步同的学习率
optimizer = Adam(
[{'params':model.hidden.parameters(),'lr':0.0001},
{'params':model.regression.parameters(),'lr':0.01}],
lr=1e-2 # 其他没有指定的所有参数
)
(3).不同的epoch设置不同的学习率
随着训练次数的增加,适当调整学习率会使得训练效果更好,达到这样的效果分为两步:
- 选择合适的学习率更新表
- 执行梯度更新
from torch.optim.lr_scheduler import LambdaLR,StepLR,MultiStepLR,ExponentialLR,CosineAnnealingLR
# 1.不同的参数组设置不同的学习调整策略
LambdaLR(optimizer, # 优化器
lr_lambda, # 自定义调整规则
last_epoch=-1, # 始调整学习率的时间,默认-1表示初始值
verbose=False # 是否打印更新状态
)
# Example:
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
train(...)
validate(...)
scheduler.step()
scheduler.get_lr() # 获取当前的学习率
# 2.等间隔调整学习率
StepLR(
optimizer,
step_size, # 学习率更新的epoch间隔
gamma=0.1, # 学习率调整为上个间隔的gamma倍
last_epoch=-1,
verbose=False
)
# Example:
# lr = 0.05 if epoch < 30
# lr = 0.005 if 30 <= epoch < 60
# lr = 0.0005 if 60 <= epoch < 90
# ......
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
train(...)
validate(...)
scheduler.step()
# 3.按照设定的间隔调整学习率
MultiStepLR(
optimizer,
milestones, # epoch间隔列表,必须递增
gamma=0.1, # 学习率调整为上个间隔的gamma倍
last_epoch=-1,
verbose=False)
# Example:
# lr = 0.05 if epoch < 30
# lr = 0.005 if 30 <= epoch < 80
# lr = 0.0005 if epoch >= 80
scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
for epoch in range(100):
train(...)
validate(...)
scheduler.step()
# 4.按照实数衰减设置学习率
ExponentialLR(optimizer,gamma,last_epoch=-1,verbose=False)
# lr 的变化情况为:lr = lr*(gamma^epoch)
# 5.余弦为周期,在每个周期最大值时调整学习率
CosineAnnealingLR(optimizer,T_max,eta_min=0,last_epoch=-1,verbose=False)
# T_max (int): 迭代iterations次后重新调整学习率
# eta_min (float): 每个epoch的最小学习率
二.损失函数
1.参数
# 均方误差
torch.nn.MSELoss(
size_average=True, # 计算的损失为每个batch的均值,否则为每个batch的和。未来会被reduction代替
reduce=True, # 是否根据size_average参数设定计算损失。未来会被reduction代替
reduction='mean' # 计算损失的方式:'none'|'mean'|'sum'。'mean':损失为每个batch的均值,'sum':损失为每个batch的和
)
# 交叉熵损失函数
torch.nn.CrossEntropyLoss(
weight,
size_average=True,
ignore_index=True,
reduction='mean',
label_smoothing=0.0) # 标签平滑系数
2.常用损失函数
类 | 名称 | 使用类型 |
---|---|---|
torch.nn.L1Loss() | 平均绝对值误差损失 | 回归 |
torch.nn.MSELoss() | 均方误差损失 | 回归 |
torch.nn.CrossEntropyLoss() | 交叉熵损失 | 多分类 |
torch.nn.NLLLoss() | 负对数似然函数损失 | 多分类 |
torch.nn.NLLLoss2d() | 图片负对数似然函数损失 | 图像分割 |
torch.nn.KLDivLoss() | KL散度损失 | 回归 |
torch.nn.BCELoss() | 二分类交叉熵损失函数 | 二分类 |
torch.nn.MarginRankingLoss() | 评价相似度的损失 | |
torch.nn.MultiLabelMarginLoss() | 多标签分类的损失 | 多标签分类 |
torch.nn.SmoothL1Loss() | 平滑的L1损失 | 回归 |
torch.nn.SoftMarginLoss() | 多标签二分类问题的损失 | 多标签二分类 |