一、Dataset的参数
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一旦使用,损失函数、数据、神经网络必须同时运行在cuda上,否则将会报错
①检测Cuda设备
if torch.cuda.is_available():
print("检测到了cuda")
②将数据转换为cuda
将数据转换为cuda类型有以下两种方法
imgs.to('cuda') #或者.to('cpu')
imgs.cuda()
③损失函数的cuda调用
loss_fn=nn.CrossEntropyLoss()
loss_fn=loss_fn.cuda() #将其转换为cuda
loss=loss_fn(outputs.to('cuda'),targes.to('cuda')) #调用
④神经网络的cuda调用
mynet=MyNerNet().cuda() #将网络cuda实例化
outputs=mynet(imgs.to('cuda')) #使用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))
调用结果如下