混合精度适配网络样例
以下样例为混合精度适配前网络样例,用户需根据具体场景选择适配方法,具体适配操作请参考(可选)混合精度适配。
网络结构构建
构建一个简单的神经网络。
#引入模块 
import time 
import torch 
import torch.nn as nn 
import torch_npu 
from torch.utils.data import Dataset, DataLoader 
import torchvision 
 
# 指定运行Device,用户请自行定义训练设备号 
device = torch.device('npu:0') 
 
# 定义一个简单的神经网络 
class CNN(nn.Module): 
    def __init__(self): 
        super(CNN, self).__init__() 
        self.net = nn.Sequential( 
            nn.Conv2d(in_channels = 1, out_channels = 16, 
                      kernel_size = (3, 3), 
                      stride = (1, 1), 
                      padding = 1), 
            nn.MaxPool2d(kernel_size = 2), 
            nn.Conv2d(16, 32, 3, 1, 1), 
            nn.MaxPool2d(2), 
            nn.Flatten(), 
            nn.Linear(32*7*7, 16), 
            nn.ReLU(), 
            nn.Linear(16, 10) 
        ) 
    def forward(self, x): 
        return self.net(x)
数据集定义与加载
这一部分我们从torchvision中获取训练数据集,设置训练相关的参数batch_size和数据集加载Dataloader。
# 数据集获取 
train_data = torchvision.datasets.MNIST( 
    root = 'mnist', 
    download = True, 
    train = True, 
    transform = torchvision.transforms.ToTensor() 
) 
# 定义batchsize 
batch_size = 64  
# 定义DataLoader 
train_dataloader = DataLoader(train_data, batch_size = batch_size)  
损失函数与优化器定义
定义损失函数与优化器。
# 把模型放到指定NPU上 model = CNN().to(device) # 定义损失函数 loss_func = nn.CrossEntropyLoss().to(device) # 定义优化器 optimizer = torch.optim.SGD(model.parameters(), lr = 0.1)
模型训练过程构建
定义模型训练设置循环。
# 设置循环 
epochs = 10 
for i in range(epochs): 
    for imgs, labels in train_dataloader: 
        start_time = time.time()   # 记录训练开始时间 
        imgs = imgs.to(device)     # 把img数据放到指定NPU上 
        labels = labels.to(device) # 把label数据放到指定NPU上 
        outputs = model(imgs)    # 前向计算 
        loss = loss_func(outputs, labels)    # 损失函数计算 
        optimizer.zero_grad() 
        loss.backward()          # 损失函数反向计算 
        optimizer.step()         # 更新优化器
模型保存构建
定义模型保存路径与方法。
PATH = "state_dict_model.pt" # 创建保存路径 torch.save(model.state_dict(), PATH)# 保存模型
父主题: 附录