目录
前言
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、要解决的问题 ?
基于pytorch的模型训练过程。
要解决的问题
二、如何做
1.训练模型
定义一个用于训练和验证过程的的函数
def train_one_epoch(model, optimizer, data_loader, device, epoch):
model.train()
# 定义损失函数
loss_function = torch.nn.CrossEntropyLoss()
mean_loss = torch.zeros(1).to(device)
# 梯度清零
optimizer.zero_grad()
for step, data in enumerate(data_loader):
images, labels = data
# 前向传播
pred = model(images.to(device))
loss = loss_function(pred, labels.to(device))
# 反向传播
loss.backward()
mean_loss = (mean_loss * step + loss.detach()) / (step + 1) # update mean losses
# 优化
optimizer.step()
# 梯度清零
optimizer.zero_grad()
return mean_loss.item()
在main函数中就可以调用该训练函数了,使用该函数前确保,要传入5个参数
# 准备好数据,其中ImageDataset是自定义数据集的加载方式,要实现 __init__ __len__ __getitem__这三个类方法
train_set = ImageDataset(train_data, transform=data_transform["train"])
train_loader = torch.utils.data.DataLoader(train_set,
batch_sampler=train_batch_sampler,
pin_memory=True,
num_workers=nw,
collate_fn=train_set.collate_fn)
# 实例化了model
optimizer = optim.SGD(pg, lr=args.lr, momentum=0.9, weight_decay=0.005)
# 是CPU、GPU、还是单机多卡
device = torch.device(args.device)
# 训练周期
epoch = 100
2.验证函数
分类网络中、计算性能指标:例如准确率的代码如下(示例):该函数返回多少个预测正确的个数
损失是用来衡量模型在验证集上的拟合程度或误差大小的指标,是一种常见做法,通过计算损失,你可以获得模型在验证集上的损失值,以进一步评估模型的性能。
# 表示梯度不再更新, 上下文管理器关闭梯度计算以加快推理速度
@torch.no_grad()
def evaluate(model, data_loader, device):
# 将模型设为评估模式
model.eval()
total_samples = 0 # 累计总样本数
loss_function = torch.nn.CrossEntropyLoss()
# 用于存储预测正确的样本个数
sum_num = torch.zeros(1).to(device) # acc = 0.0
for step, data in enumerate(data_loader):
images, labels = data
pred = model(images.to(device))
loss = loss_function(pred, labels)
total_loss += loss.item() * images.size(0)
total_samples += images.size(0) # 对当前批次中的样本数量,在不同批次中进行累加
pred = torch.max(pred, dim=1)[1]
sum_num += torch.eq(pred, labels.to(device)).sum()
avg_loss = total_loss / total_samples
return sum_num.item() avg_loss
在main()函数中,要知道 "验证集中的样本总数"才能算准确率
注意:images是一个形状为
(batch_size, channels, height, width)
的四维张量,张量对象有一个size()
方法,它返回张量在每个维度上的大小。我想获得当前批次中样本的数量,即batch_size
sum_num ,avg_loss = evaluate(model=model,
data_loader=val_loader,
device=device)
acc = sum_num / val_sampler.total_size
总结
以上就是有关训练和验证模型的内容,侵权立删。