继续创造,加快生长!这是我参加「日新计划 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界说丢失函数和优化器