首页 > 编程知识 正文

pytorch实现卷积神经网络,神经网络与pytorch实战

时间:2023-05-05 22:55:14 阅读:38354 作者:3971

基于pytorch训练卷积神经网络的图像分类(官方教程详细解读)文章主要内容[官方文档]

对CIFAR10数据集的pytorch图像分类代码的解读,旨在解答每行代码的作用,整理整体过程。 按照官方文档的顺序,用注释回答每行代码的意图和含义

读取注释CIFAR10,并导入porttorchvision.transformsage,包括标准化的导入torch vision #工具库、数据集、模型、图像操作和其他操作顺序[0- 255 ]-[ 0,1 ]-[-1,1 ] transform=transforms.com pose ([ transforms.to tensor ],transforms.normalize ) 0.5 ) ) )读入CIFAR10训练集并标准化后,在./data中输入trainset=torch vision.datasets.cifa r10 (root='./data ',train Dowa transform=transform(#培训数据集train loader=torch.utils.data.data loader (trainset,batch_size=4, 批量加载shuffle=True )的num_workers=2) testset=torch vision.datasets.cifa r10 (root='./data ',train=False transform=transform (test loader=torch.utils.data.data loader (testset,batch_size=4,shuffle=False,num ) 所谓的标签classes=('plane '、' car '、' bird '、' cat '、' deer '、' dog '、' frog '、' horse '、' ship '、' truck ) 也就是说,图像是打包的,每个包都有size个。 示例中的四张图像是一组。shuffle数据集是否按顺序加载num_workers线程数2 .这些图像import matplotlib.pyplot as plt #绘画画廊import numpy as np # functionstoshowanimagedefimshow (: #增加图像对比度以使暗区变亮img=img/2 0.5 # unnormalize #图像为nparrarynpimg=img.ng 这里需要置换。 pytorch和numpy的多维顺序结构问题PLT.imshow(NP.transpose ) NPimg,((1,2, 0 ) ) plt.show () # get some random training images# )迭代器dataiter=ITER(trainloader ) #图像数组(4个)标签数组) 4个images, labels=data ITER.next (# show images )合并图像以获取im show (torch vision.utils.make _ grid ) images ) printlabelsprint ' ' 这是因为在变换为1]之后,0的地方多,也就是说表现得暗,所以为了容易显示,通过值调整使暗的地方变亮

NP.transpose(npimg,)、1、2、0 )倒排的原因,在transforms中三个函数的原理和意义上有说明

在images中是4张3通道(RGB )的32*32的图像,size为torch.size ([ 4,3,32,32 ] )

在labels中,四个标签类似于[2、4、5、1],四个图像分别对应于classes数组的索引号。 size是Torch.size([4] )。

torchvision.utils.make_grid的作用是将多个图像合并为网格结构中的一个图像

3.CNN定义网络import torch.nnasnnimporttorch.nn.functional ASF # #

继承nn.Module的Net类class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return xnet = Net() 此网络类比于LeNet-5结构,像nn.Conv2d(3, 6, 5)中的参数根据输入集填写,涉及卷积后与池化后的size,具体含义请查看CNN原理其中各卷积和池化对象的参数,例如self.conv1(x)中x,有4个参数,分别为(batch_size,channel,row,column) 即一次处理的批量个数,通道数,图片size。 本例中为 (4*3*32*32),这也使得最后x处理的最终size为(4*10)即4张图各自对应10个类别的概率x.view(-1, 16 * 5 * 5)拉平操作,-1指自动计算,拉平为一维那自动计算为16 * 5 * 5 4.训练模型 # 梯度优化库import torch.optim as optim# CrossEntropy损失函数对象criterion = nn.CrossEntropyLoss()# 随机梯度下降法,学习率0.001,动量0.9optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练两次for epoch in range(2): # loop over the dataset multiple times running_loss = 0.0 # 枚举enumerate(trainloader, 0) 0指索引从0开始即i从0开始 for i, data in enumerate(trainloader, 0): # inputs:4*3*32*32 labels:4 inputs, labels = data # 清空梯度值 optimizer.zero_grad() # forward + backward + optimize outputs = net(inputs) loss = criterion(outputs, labels) # 后向传播,计算各参数梯度下降值 loss.backward() # 执行参数更新 optimizer.step() # 统计每2000个批处理的平均损失值 running_loss += loss.item() if i % 2000 == 1999: # print every 2000 mini-batches print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0print('Finished Training') 随机梯度下降法,学习率与贯性动量问题,请查找模型优化原理方法item()是pytorch中的取值操作 5.保存模型参数与测试模型 # 保存模型的状态参数字典PATH = './cifar_net.pth'torch.save(net.state_dict(), PATH)# 创建网络,加载网络模型net = Net()net.load_state_dict(torch.load(PATH))# 加载测试数据correct = 0total = 0with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) # 取以列为基准的最大值序列与索引号 _, predicted = torch.max(outputs.data, 1) total += labels.size(0) # 对比相等的地方,相等即为1,不相等为0,加和后取值即正确的个数 correct += (predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) torch.no_grad()作用是包含的地方不计算梯度torch.max(outputs.data, 1)以列为基准获取最大值,返回值为 最大值的序列和各自基准下对应的索引号(predicted == labels).sum().item() 序列按照索引号一一比对,相等赋值1,不相等赋值0。加和取值 可运行的源码已上传至资源,免费下载

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。