继续创造,加快生长!这是我参加「日新计划 10 月更文挑战」的第5天,点击检查活动概况
前语
一旦模型、数据集、丢失函数和优化器准备完成后,咱们就可以开始练习模型了。在本节中,咱们将学习怎么正确练习和评价深度学习模型。
模型练习与评价
咱们首要编写用于批 (batch
) 处理、时期 (epoch
) 处理和练习模型的辅佐函数。
1. 编写辅佐函数核算每批数据的丢失值:
def loss_batch(loss_func, xb, yb,yb_h, opt=None):
loss = loss_func(yb_h, yb)
metric_b = metrics_batch(yb,yb_h)
if opt is not None:
loss.backward()
opt.step()
opt.zero_grad()
return loss.item(), metric_b
2. 接下来,界说一个辅佐函数来核算模型在每批数据上的准确率:
def metrics_batch(target, output):
pred = output.argmax(dim=1, keepdim=True)
corrects=pred.eq(target.view_as(pred)).sum().item()
return corrects
3. 接下来,界说一个辅佐函数来核算数据集的丢失和度量值:
def loss_epoch(model,loss_func,dataset_dl,opt=None):
loss=0.0
metric=0.0
len_data=len(dataset_dl.dataset)
for xb, yb in dataset_dl:
xb=xb.type(torch.float).to(device)
yb=yb.to(device)
yb_h=model(xb)
loss_b,metric_b=loss_batch(loss_func, xb, yb,yb_h, opt)
loss+=loss_b
if metric_b is not None:
metric+=metric_b
loss/=len_data
metric/=len_data
return loss, metric
4. 最后,界说 train_val
函数用于评价模型功能:
def train_val(epochs, model, loss_func, opt, train_dl, val_dl):
for epoch in range(epochs):
model.train()
train_loss, train_metric=loss_epoch(model,loss_func,train_dl,opt)
model.eval()
with torch.no_grad():
val_loss, val_metric=loss_epoch(model,loss_func,val_dl)
accuracy=100*val_metric
print("epoch: %d, train loss: %.6f, val loss: %.6f, accuracy: %.2f" %(epoch, train_loss,val_loss,accuracy))
5. 练习模型数个 epoch
:
num_epochs=5
train_val(num_epochs, model, loss_func, opt, train_dl, val_dl)
练习开始后,可以看到模型练习过程中丢失和功能变化:
epoch:0, train loss: 0.22345, val loss: 0.094503, accuracy: 96.94
...
epoch:5, train loss: 0.02345, val loss: 0.049503, accuracy: 98.02
存储和加载模型
练习完成后,咱们可以将练习后的参数存储在文件中以供布置和之后加载运用,有两种常见的保存模型的办法。
首要,咱们介绍榜首种办法。
1. 首要,将模型参数或state_dict
存储在文件中:
path2weights="./models/weights.pt"
torch.save(model.state_dict(), path2weights)
2. 要从文件中加载模型参数,需求界说一个 Net
类的对象:
_model = Net()
3. 然后,从文件中加载 state_dict
:
weights=torch.load(path2weights)
4. 接下来,将 state_dict
设置为模型参数:
_model.load_state_dict(weights)
接下来,咱们继续学习第二种办法。
1. 首要,将模型存储在一个文件中:
path2model="./models/model.pt"
torch.save(model,path2model)
2. 要从文件中加载模型参数,首要将界说一个 Net
类的对象:
_model = Net()
3. 然后,从本地文件中加载模型:
_model=torch.load(path2model)
在本末节中,咱们学习了两种存储练习模型的办法。在榜首种办法中,咱们只存储了 state_dict
或模型参数。当咱们需求练习好的模型进行布置时,咱们必须创立模型的对象,然后从文件中加载参数,然后将参数设置到模型中,这种方式是PyTorch
推荐的办法。
在第二种办法中,咱们将模型存储到一个文件中,即咱们将模型和 state_dict
都存储在一个文件中。当咱们需求练习好的模型进行布置时,咱们都需求创立一个 Net
类对象。然后,咱们从文件中加载模型。因而,与榜首种办法相比并没有实际的优势。
布置模型
要布置模型,咱们需求运用上一末节中介绍的办法加载模型。一旦模型被加载到内存中,咱们就可以将新数据传递给模型,运用模型进行猜测。
1. 要将模型布置在验证数据集中的样本图画上,咱们首要加载一个样本张量:
n=100
x= x_val[n]
y=y_val[n]
print(x.shape)
2. 然后,对样本张量进行预处理:
x= x.unsqueeze(0)
x=x.type(torch.float)
x=x.to(device)
3. 接下来,运用加载完成的神经网络模型获取猜测结果:
output=_model(x)
pred = output.argmax(dim=1, keepdim=True)
print (pred.item(),y.item())
相关链接
PyTorch张量操作详解
PyTorch数据加载和处理
PyTorch神经网络模型构建
PyTorch界说丢失函数和优化器