Red neuronal (14) Pytorch Complete Model Training and Calling GPU Acceleration

1. Entrenamiento modelo

        Paso 1. Preparar el conjunto de datos

import torchvision

train_data = torchvision.dataset.CIFAR10("../data",train=True,
        transform=torchvision.ToTensor,download=True)    --载入训练集
test_data = torchvision.dataset.CIFAR10("../data",train=False,
        transform=torchvision.ToTensor,download=True)    --载入测试集

                        Consejos Obtenga la longitud del conjunto de datos

train_data_size = len(train_data)

        Paso 2. Cargue el conjunto de datos

train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)

        Paso 3. Construya una red

class MyNerNet(nn.Moduel):
    def __init__(self):
        super(MyNerNet,self).__init__()    --基类初始化
        self.model = nn.Sequential(                  --网络序列器
                            nn.Cov2d(3,32,5,1,2),    --卷积
                            nn.MaxPool2d(2),         --池化
                            nn.Conv2d(32,32,5,1,2),
                            nn.MaxPool2d(2),
                            nn.Conv2d(32,64,5,1,2),
                            nn.MaxPool2d(2),
                            nn.Flatten(),            --展平
                            nn.Linear(64*4*4,64),    --线性层
                            nn.Linear(64,10)         --线性层代分类器)

    def forward(self,x):    --传递函数
        return self,model(x)

                El código relacionado con la red se puede colocar en un archivo separado, pero se debe hacer referencia en el archivo principal usando

from model import *    --将model文件中所有的内容引用

        Paso 4. Crear función de pérdida y optimizador

loss_fn = nn.CrossEntropyLoss()    --交叉损失函数

learing_rate=0.01    --学习速率,外置方便修改
optimizer = torch.optim.SGD(MyNerNet.parameters(),lr=learing_rate)    --随机梯度下降

        Paso 5. Entrenamiento + prueba

--设置一些计数器
    total_train_step = 0    --记录训练次数
    total_test_step = 0    --记录训练次数
    epoch = 10    --训练轮数

--开始训练
    for i in range(epoch):
        print("---第{}轮训练---".format(i+1))
        for data in train_dataloader
            imgs,targets = data    --拆包
            outputs = mynet(imgs)    --使用网络
            loss = loss_fn(outputs,targets)    --计算损失函数

            optimizer.zero_grad()    --梯度清零
            loss.backforward()    --前向传递
            optimizer.step()    --逐步优化

            total_train_step += 1    --计数
            print("训练次数:{},Loss:{}".format(total_train_step,loss.item()))    
                --展示//也可以使用TensorBorad进行展示

    --开始测试
        total_test_loss = 0    --总损失函数计数
        with torch.no_grad():    --不设置梯度(保证不进行调优)
            for data in test_dataloader:
                imgs,targets = data    --拆包
                outputs = mynet(imgs)    --使用网络
                loss = loss_fn(outputs,targets)    --计算损失函数
                total_test_loss = total_test_loss + loss  --添加此次部分损失函数
        print("整个测试集上的Loss:{}".format(total_test_loss))
        total_test_step = total_test_step + 1

    --保存每轮的模型
        torch.save(mynet,"MyNerNet_Ver{}.pth".format(total_train_step))

                Consejos Visualización correcta de la tasa (para problemas de clasificación)

outputs = torch.Tensor([[0.1,0.2],
                        [0.3,0.4]])

preds = outputs.argmax(1)    --最大延展
targets = Torch.Tensor([0,1])    --真实输入

print(preds == targets)    --检验(对应位置是否相等),输出正确的个数

2. Cuestiones que requieren atención en la formación de modelos

        1. Modo de prueba/entrenamiento de red

                Cuando la red contiene Dropout y BatchNorm , debe llamarse

                Pero si no hay contenido correspondiente, no es necesario y el uso no es válido.

mynet.train()    --训练模式
mynet.test()    --测试模型

        2. Apague el gradiente durante la prueba

                Esta línea de código debe llamarse antes de la prueba para desactivar el gradiente de la red.

with torch.no_grad():    

3. Usa la GPU para entrenar la aceleración

        1. Método 1 : llamar a la función .cuda() en el modelo de red original , datos (entrada, etiqueta) y función de pérdida

mynet = mynet.cuda()    --对网络调用

loss_fn = loss_fn.cuda()    --对损失函数调用

imgs = imgs.cuda()    --仅对部分数据生效(数据集的输入数据)

Sin embargo, si la computadora no tiene una tarjeta N, se informará un error. Es mejor agregar una función de verificación                 al frente del código.

if torch.cuda.is_available()
    mynet = mynet.cuda()    --有GPU再将网络进行转移

2. Método 2: llame a la función .to ( dispositivo)         en el modelo de red original , datos (entrada, etiqueta) y función de pérdida: transfiera a otros dispositivos

Device = torch.device("cpu")    --调用CPU
Device = torch.device("cuda")    --调用GPU
Device = torch.device("cuda:0")    --调用第一块GPU(当存在多块GPU时)
mynet.to(device)    --流转到设备

Supongo que te gusta

Origin blog.csdn.net/weixin_37878740/article/details/127058802#comments_27248191
Recomendado
Clasificación