机器学习的基本任务
一般分为四大类:监督学习、无监督学习、半监督学习、强化学习。
模型的选择及损失函数
问题分类 | 最后一层激活函数 | 损失函数 |
---|---|---|
二分类,单标签 | 添加sigmoid层 | nn.BCELoss |
二分类,单标签 | 不添加sigmoid层 | nn.BCEWithLogitsLoss |
二分类,多标签 | 无 | nn.SoftMarginLoss |
多分类 ,单标签 | 不添加softmax层 | nn.CrossEntroptLoss |
多分类 ,单标签 | 添加softmax层 | nn.NLLLoss |
多分类,多标签 | 无 | nn.MulitiLabelSoftMarginLoss |
回归 | 无 | nn.MSELoss |
识别 | 无 | nn.TripleMarginLoss |
识别 | 无 | CosineEmbeddingLoss |
评估及优化
- 留出法(Holdout):留出法的步骤相对简单,直接将数据集划分为两个互斥的集合,其中一个作为训练集,另一个作为测试集。在模型训练集训练出模型后,用测试集来评估测试误差,作为泛化误差。
- K折交叉验证:不停的随机将训练数据集划分为k个,其中k-1个用于模型训练,剩余一个用于测试。
- 重复的K折交叉验证:当数据量较小,数据分布很不均匀时可以采用这种方法。使用训练数据构建模型后,通常使用测试数据对模型进行测试,测试模型对数据的适应情况,如果使用测试数据对模型测试满意,就用此模型对以后的数据进行预测,如果结果不满意,可以优化模型。
过拟合与欠拟合
在模型训练过程中,经常会出现刚开始训练时,训练和测试的精度往往不高(或损失值大),然后通过迭代次数优化,训练精度和测试精度会继续提升。但随着我们训练迭代次数的增加或不断优化,也有可能出现训练精度或损失值继续改善,但测试精度或损失值不降反升的情况。
解决方法:
- 权重正则化
- Dropout
- 批量正则化
- 权重初始化
GPU加速
单GPU加速
查看GPU配置:nvidia-smi
查看可以使用的GPU数量:torch.cuda.device_count()
查看GPU是否可用:torch.cuda.is_available()
把数据从内存移动到GPU,一般针对张量(需要的数据)和模型。对张量,一律使用方法.to(device)或.cuda()
import torch
# 方法一
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# 方法二
device = torch.device('cuda')
# 使用方法进行封装
def get_device():
return 'cuda' if torch.cuda.is_available() else 'cpu'
device = get_device()
print(device)
多GPU加速
- 使用全部GPU
使用时直接用model传入torch.nn.DataParallel()
函数即可
torch.nn.DataParallel(model)
- 使用部分GPU
假设电脑有多块GPU,只想利用一部分,如果只想使用编号为0,1,3,4的4块GPU采用下面的方式。
device_ids = [0, 1, 2, 3, 4]
# 对数据
input_data = input_data.to(device=device_ids)
# 对模型
net = torch.nn.DataParallel(model)
net.to(device)
或者
os.environ['CUDA_VISIBLE_DEVICES'] = ','.join(map(str, [0,1,3,4]))
net = torch.nn.DataParallel(model)
使用GPU注意事项
- GPU的数量尽可能为偶数,奇数的GPU可能出现异常中断
- 数据量较小的时候,单GPU比多GPU快
- 如果内存不够大,使用多GPU训练可设置pin_memory为False