dataset使用时transform的参数要由ToTensor()修改为torchvision.transforms.ToTensor()。完整函数如下:
- train_data=torchvision.datasets.CIFAR10("../data",train=True,
- transform=torchvision.transforms.ToTensor(),download=False)
训练集同理
nn.Linear(64*4*4,64), #卷积核(三围),卷积核尺寸
- self.model = nn.Sequential(#内容)
-
- x = self.model(x) #调用
Cuda一旦使用,损失函数、数据、神经网络必须同时运行在cuda上,否则将会报错
- if torch.cuda.is_available():
- print("检测到了cuda")
将数据转换为cuda类型有以下两种方法
- imgs.to('cuda') #或者.to('cpu')
-
- imgs.cuda()
- loss_fn=nn.CrossEntropyLoss()
- loss_fn=loss_fn.cuda() #将其转换为cuda
-
- loss=loss_fn(outputs.to('cuda'),targes.to('cuda')) #调用
- mynet=MyNerNet().cuda() #将网络cuda实例化
-
- outputs=mynet(imgs.to('cuda')) #使用cuda网络
imgs.to('cpu') #在将其用于其他用途时需要先转换回cpu型
- #网络模型Model.py
-
- from msilib import sequence
- from turtle import forward
- import torch.nn as nn #神经网络库
- import torch.nn.functional as F #函数库
-
- class MyNerNet(nn.Module):
- def __init__(self):
- super(MyNerNet,self).__init__()
- self.model = nn.Sequential(
- nn.Conv2d(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): #传递函数
- x = self.model(x)
- return x
- #网络调用
-
- from pickletools import optimize
- import torch #导入torch库
- import torchvision #导入图像处理库
- from torch.utils.data import DataLoader as Loader #加载器
- from Model import * #加载自建模型
- import torch.nn as nn #引入神经网络支持
-
- train_data=torchvision.datasets.CIFAR10("E:\\CxxDemo\\Python\\Cnn_AlexNet_Test\\data",train=True,transform=torchvision.transforms.ToTensor(),download=False) #训练集dataset
- test_data=torchvision.datasets.CIFAR10("E:\\CxxDemo\\Python\\Cnn_AlexNet_Test\\data",train=False,transform=torchvision.transforms.ToTensor(),download=False) #测试集dataset
-
- train_data_size=len(train_data)
- test_data_size=len(test_data)
-
- train_loader = Loader(train_data,batch_size=64,shuffle=True) #训练集加载器
- test_loader = Loader(test_data,batch_size=64,shuffle=True) #测试集加载器
-
-
- mynet=MyNerNet().cuda() #将网络实例化
-
- #构建损失函数
- loss_fn=nn.CrossEntropyLoss() #交叉损失函数
-
- loss_fn=loss_fn.cuda() #调用cuda
-
- learing_rate=0.01 #学习率
- optimizer = torch.optim.SGD(mynet.parameters(),lr=learing_rate) #随机梯度下降
-
- #设置计数器
- total_train_step=0 #训练次数
- total_test_step=0 #测试次数
- epoch=10 #训练轮次
-
- #开始训练
- for i in range(epoch):
- print("---第{}论训练".format(i+1))
- # mynet.train() #开始训练!!!
- for data in train_loader:
- imgs,targes=data #拆包
- outputs=mynet(imgs.to('cuda')) #使用网络
- loss=loss_fn(outputs.to('cuda'),targes.to('cuda')) #计算损失函数
-
- optimizer.zero_grad() #梯度清零
- loss.backward() #前向传递
- optimizer.step() #逐步优化
-
- total_train_step+=1 #训练计数
- print("训练次数:{},Loss:{}".format(total_train_step,loss.item()))
-
- #开始测试
- total_test_loss = 0 #总损失函数计数
- with torch.no_grad(): #不设置梯度(保证不进行调优)
- for data in test_loader:
- imgs,targets = data #拆包
- outputs = mynet(imgs.to('cuda')) #使用网络
- loss = loss_fn(outputs.to('cuda'),targets.to('cuda')) #计算损失函数
- 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))
调用结果如下
