PyTorch学习笔记(二)卷积神经网络流程

深度学习框架的一般流程:

1.数据加载和处理

2.定义一个模型(包括网络、损失函数和优化器)

3.在训练集上进行训练

4.在测试集上测试模型的性能

(步骤1、2可以调换)

步骤一:使用Torchvision加载和规范化CIFAR10训练集和测试集

torchvision模块可以加载数据,也可以处理数据等等

import torch
import torchvision
import torchvision.transforms as tranforms

#步骤一:使用Torchvision加载和规范化CIFAR10训练集和测试集

#torchvision数据集的输出是范围[0, 1]的PILImage图像。需要将它们转换为归一化范围[-1, 1]的tensor。
#定义一个变换transform 利用transforms模块中的Compose()函数把ToTensor和Normalize组合在一起
transform = transforms.Compose(
    [tranforms.ToTensor(),
    transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]) 

batch_size = 4

#数据集
trainset = torchvision.datasets.CIFAR10(
        root='./data',
        train=True,
        download=True,
        transform=transform#上面定义的转换数据方式
        )
testset = torchvision.datasets.CIFAR10(
        root='./data',
        train=False,
        download=True,
        transform=transform#上面定义的转换数据方式
        )
#加载数据
trainloader = torch.utils.data.DataLoader(trainset,batch_size=batch_size,
                                         shuffle=True,num_workers=2)
testloader = torch.utils.data.DataLoader(testset,batch_size=batch_size,
                                        shuffle=False,num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

步骤二:定义一个模型(包括网络、损失函数和优化器)

1.定义卷积神经网络模型主要用到torch.nn和torch.nn.functional两个模块

torch.nn大多数的layer在functional中都有函数与之对应,但是不同之处在于functional中的函数只进行计算,不管参数更新啥的。所以如果模型有可学习的参数就放用nn定义,否则二者都可以没啥区别。比如这里的卷积、池化等是用nn定义的(有需要学习的参数),而Relu就是用function定义的(因为没有可学习的参数,就是一个简单的运算)

2.定义优化器用到torch.optim模块,定义损失函数用到nn模块

#定义一个卷积神经网络
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim         
 
#定义神经网络
class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3,6,5)#输入通道数为3 输出通道数为6 ,kernel_size为5*5
        self.pool = nn.MaxPool2d(2,2)#2*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)))#functional定义的Relu
        x = self.pool(F.relu(self.conv2(x)))
        x = torch.flatten(x,1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)      
        return x

net = Net()

#定义损失函数和优化器
criterion = nn.CrossEntropyLoss()    #交叉熵损失函数
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)   #随机梯度下降

步骤三:在训练集上进行训练

#训练网络
for epoch in range(2): #数据集循环两次
    
    runing_loss = 0.0
    for i,data in enumerate(trainloader,0):
        #得到输入,数据是一个列表[inputs,labels]
        inputs,labels = data
        
        #将参数的梯度值归零
        optimizer.zero_grad()
        
        #正向传播+反向传播+优化器
        outputs = net(inputs)
        loss = criterion(outputs,labels)
        loss.backward()
        optimizer.step()
        
        #输出结果
        runing_loss += loss.item()
        if i%2000 == 1999:
            print('[%d %5d] loss: %.3f' %
                 (epoch + 1,i+1,runing_loss / 2000))
            runing_loss = 0.0
print('Finish Training!')
            

步骤四:在测试集上测试模型的性能

#测试一个batch_size的图片

dataiter = iter(testloader)      # 创建一个python迭代器,读入已经加载好的testloader
images, labels = dataiter.next() # 迭代器用.next()访问.返回batch_size=4张的图片

# print images
imshow(torchvision.utils.make_grid(images))  
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))

#用网络进行预测 
outputs = net(images)   
_, predicted = torch.max(outputs.data, 1) #获得最大值的索引(第几类)
            
print('Predicted: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4))) 
#在整个测试集上进行测试
correct = 0
total = 0
# 在测试时不需要计算梯度
with torch.no_grad():
    for data in testloader:
        images, labels = data
        #计算正向传播预测的结果
        outputs = net(images)
        #最大值的索引
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)#测试图片的数量
        correct += (predicted == labels).sum().item()#正确分类图片的数量

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch深度学习实战中,可以使用卷神经网络来进行图像分类任务。在实战中,可以使用经典的卷神经网络模型,如VGG、ResNet、Inception和DenseNet等。这些模型都是在深度学习的发展过程中出现的经典模型,对深度学习的学术研究和工业生产都起到了巨大的促进作用。初学者可以通过阅读论文和实现代码来全面了解这些模型。例如,可以使用PyTorch中的torchvision.models模块来加载预训练的卷神经网络模型,如VGG-16、VGG-19和ResNet等\[1\]。其中,VGG-16和VGG-19是由卷层、池化层和全连接层等不同组合构成的经典卷神经网络模型\[1\]。而ResNet是一种使用残差单元连接而成的卷神经网络模型,通过跨层的短接来突出微小的变化,使得网络对误差更加敏感,并解决了网络退化现象,具有良好的学习效果\[2\]\[3\]。因此,在PyTorch深度学习实战中,可以选择合适的卷神经网络模型来进行图像分类任务。 #### 引用[.reference_title] - *1* *2* *3* [PyTorch深度学习实战 | 典型卷神经网络](https://blog.csdn.net/qq_41640218/article/details/129832298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值