学做软件的网站有哪些内容,如何美化wordpress页面,简单网页设计主题,东莞网站推广建设应该算是完结啦~再次感谢土堆老师#xff01;
模型训练
模型训练基本可以分为以下几个步骤按序执行#xff1a;
引入数据集-使用dataloader加载数据集-建立模型-设置损失函数-设置优化器-进行训练-训练中计算损失#xff0c;并使用优化器更新参数-模型测试-模型存储
习惯上会…应该算是完结啦~再次感谢土堆老师
模型训练
模型训练基本可以分为以下几个步骤按序执行
引入数据集-使用dataloader加载数据集-建立模型-设置损失函数-设置优化器-进行训练-训练中计算损失并使用优化器更新参数-模型测试-模型存储
习惯上会将model和train代码分开写当然一开始混合写也没啥问题直接给出一个例程
# train.py
import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader
import torch.nn as nn
from model import *
import timefrom torch.utils.tensorboard import SummaryWriterdata_transforms transforms.Compose([transforms.ToTensor()
])#引入数据集
train_data datasets.CIFAR10(./dataset,trainTrue,transformdata_transforms,downloadTrue)test_data datasets.CIFAR10(./dataset,trainFalse,transformdata_transforms,downloadTrue)#加载数据
train_dataloader DataLoader(train_data,batch_size64)
test_dataloader DataLoader(test_data,batch_size64)start_time time.time()#建立模型
my_module MyModule()#设置损失函数
cross_loss nn.CrossEntropyLoss()#设置优化器
#设置学习率
learning_rate 1e-2
optimizer torch.optim.SGD(my_module.parameters(),lrlearning_rate)#进行训练
#设置迭代次数
epoch 10total_train_steps 0writer SummaryWriter(train_logs)for i in range(epoch):print(第{}轮训练.format(i1))#训练my_module.train() #只对某些层起作用for data in train_dataloader:imgs, targets dataoutputs my_module(imgs)#计算损失loss cross_loss(outputs, targets)#优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_steps 1if total_train_steps % 100 0:print(训练次数{}Loss:{}.format(total_train_steps,loss.item()))writer.add_scalar(train_loss,loss.item(),total_train_steps)#测试,不再梯度下降my_module.eval() #同样只对某些层起作用 total_test_loss 0# total_test_steps 0total_accuracy 0test_data_size len(test_data)with torch.no_grad():for data in test_dataloader:imgs, targets dataoutputs my_module(imgs)loss cross_loss(outputs,targets)total_test_loss loss.item()##对于分类任务可以求一下准确的个数,非必须#argmax(1)按行取最大的下标 argmax(0)按列取最大的下标accuracy (outputs.argmax(1)targets).sum()total_accuracy accuracyprint(第{}轮的测试集Loss:{}.format(i1,total_test_loss))print(测试集准确率{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss,total_test_loss,i)end_time time.time()print(time:{}.format(end_time-start_time))#存储模型if i % 5 0:torch.save(my_module,my_module_{}.pth.format(i))print(模型存储成功)writer.close()使用GPU加速训练方式一
上述写法默认是采用cpu进行训练的会比较慢为了加速训练过程我们需要用GPU进行加速训练。对应有两种方式推荐方式二大部分例程也都是采用方式二的
需要用到GPU加速的主要有如图中的三个部分:对应有.cuda()的参数只要在原始位置后面加上.cuda()就可以考虑到有些设备没有GPU建议加上.cuda.is_avaliable的判断。同样给出完整例程
# train_gpu1.py
import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader
import torch.nn as nn
from model import *
import timefrom torch.utils.tensorboard import SummaryWriterdata_transforms transforms.Compose([transforms.ToTensor()
])#引入数据集
train_data datasets.CIFAR10(./dataset,trainTrue,transformdata_transforms,downloadTrue)test_data datasets.CIFAR10(./dataset,trainFalse,transformdata_transforms,downloadTrue)#加载数据
train_dataloader DataLoader(train_data,batch_size64)
test_dataloader DataLoader(test_data,batch_size64)start_time time.time()#建立模型
my_module MyModule()
if torch.cuda.is_available():my_module.cuda()#设置损失函数
cross_loss nn.CrossEntropyLoss()
if torch.cuda.is_available():cross_loss.cuda()#设置优化器
#设置学习率
learning_rate 1e-2
optimizer torch.optim.SGD(my_module.parameters(),lrlearning_rate)#进行训练
#设置迭代次数
epoch 10total_train_steps 0writer SummaryWriter(train_logs)for i in range(epoch):print(第{}轮训练.format(i1))#训练my_module.train() #只对某些层起作用for data in train_dataloader:imgs, targets dataif torch.cuda.is_available():imgs imgs.cuda()targets targets.cuda()outputs my_module(imgs)#计算损失loss cross_loss(outputs, targets)#优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_steps 1if total_train_steps % 100 0:print(训练次数{}Loss:{}.format(total_train_steps,loss.item()))writer.add_scalar(train_loss,loss.item(),total_train_steps)#测试,不再梯度下降my_module.eval() #同样只对某些层起作用 total_test_loss 0# total_test_steps 0total_accuracy 0test_data_size len(test_data)with torch.no_grad():for data in test_dataloader:imgs, targets dataif torch.cuda.is_available():imgs imgs.cuda()targets targets.cuda()outputs my_module(imgs)loss cross_loss(outputs,targets)total_test_loss loss.item()##对于分类任务可以求一下准确的个数,非必须#argmax(1)按行取最大的下标 argmax(0)按列取最大的下标accuracy (outputs.argmax(1)targets).sum()total_accuracy accuracyprint(第{}轮的测试集Loss:{}.format(i1,total_test_loss))print(测试集准确率{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss,total_test_loss,i)end_time time.time()print(time:{}.format(end_time-start_time))#存储模型if i % 5 0:torch.save(my_module.state_dict(),my_module_{}.pth.format(i))print(模型存储成功)writer.close()使用GPU加速训练方式二
现在更常见的写法是用device.to(device)的搭配需要引入的位置和方式一提到的没有任何差异主要就是使用上的语法会有一点点不一样所以直接给出一个例程大家看完就知道怎么用了
# train_gpu2.py
import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader
import torch.nn as nn
from model import *from torch.utils.tensorboard import SummaryWriterdata_transforms transforms.Compose([transforms.ToTensor()
])#引入数据集
train_data datasets.CIFAR10(./dataset,trainTrue,transformdata_transforms,downloadTrue)test_data datasets.CIFAR10(./dataset,trainFalse,transformdata_transforms,downloadTrue)#加载数据
train_dataloader DataLoader(train_data,batch_size64)
test_dataloader DataLoader(test_data,batch_size64)#确定设备
device torch.device(cuda if torch.cuda.is_available() else cpu)
print(device)#建立模型
my_module MyModule()
my_module.to(device)#设置损失函数
cross_loss nn.CrossEntropyLoss()
cross_loss.to(device)#设置优化器
#设置学习率
learning_rate 1e-2
optimizer torch.optim.SGD(my_module.parameters(),lrlearning_rate)#进行训练
#设置迭代次数
epoch 10total_train_steps 0writer SummaryWriter(train_logs)for i in range(epoch):print(第{}轮训练.format(i1))#训练my_module.train() #只对某些层起作用for data in train_dataloader:imgs, targets dataimgs, targets imgs.to(device), targets.to(device)outputs my_module(imgs)#计算损失loss cross_loss(outputs, targets)#优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_steps 1if total_train_steps % 100 0:print(训练次数{}Loss:{}.format(total_train_steps,loss.item()))writer.add_scalar(train_loss,loss.item(),total_train_steps)#测试,不再梯度下降my_module.eval() #同样只对某些层起作用 total_test_loss 0# total_test_steps 0total_accuracy 0test_data_size len(test_data)with torch.no_grad():for data in test_dataloader:imgs, targets dataimgs, targets imgs.to(device), targets.to(device)outputs my_module(imgs)loss cross_loss(outputs,targets)total_test_loss loss.item()##对于分类任务可以求一下准确的个数,非必须#argmax(1)按行取最大的下标 argmax(0)按列取最大的下标accuracy (outputs.argmax(1)targets).sum()total_accuracy accuracyprint(第{}轮的测试集Loss:{}.format(i1,total_test_loss))print(测试集准确率{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss,total_test_loss,i)#存储模型if i % 5 0:torch.save(my_module.state_dict(),my_module_{}.pth.format(i))print(模型存储成功)writer.close()使用模型完成任务
这个标题我想了很久应该叫什么才能和内容对应上…土堆老师原来名字叫模型验证我没看之前一直以为是evaluate的过程啊啊啊结果是test的过程
实际上我们训练完模型得到一堆准确率啊或者什么的时候并不代表我们完成了整个事情说人话就是没啥用所以这部分其实就是教我们怎么用得到的模型在其他数据上使用这一部分还蛮简单的和训练中的evaluate部分使用差不多注意点就是别忘了给图片reshape成含有batch_size的形状特别是单张的情况下当然如果有报错也可以先考虑是不是形状不太对的原因…
# test.py
from PIL import Image
import torchvision
from torchvision import transforms
from model import *image_path ./test_imgs/cat.jpg
image Image.open(image_path)
# image image.convert(RGB) # 对于png图片要加上这一句data_transforms torchvision.transforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor()])image data_transforms(image)
print(image.shape)model MyModule()
model.load_state_dict(torch.load(my_module_5.pth))image torch.reshape(image,(1,3,32,32))
model.eval()
with torch.no_grad():output model(image)print(output)
print(output.argmax(1))# torch.Size([3, 32, 32])
# tensor([[-1.5852, -1.3985, 1.0891, 2.5762, 0.1534, 2.0844, 0.6164, 1.7049,# -4.7464, -1.4447]])
# tensor([3])其实我的模型准确率没有很高但是对于这张图片竟然惊人的分对了第3类-cat