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) --流转到设备