『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # Author : Hellcat # Time : 2018/2/11 import torch as t import torch.nn as nn import torch.nn.functional as F class LeNet(nn.Module): def __init__( self ): super (LeNet, self ).__init__() self .conv1 = nn.Conv2d( 3 , 6 , 5 ) 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 = F.max_pool2d(F.relu( self .conv1(x)),( 2 , 2 )) x = F.max_pool2d(F.relu( self .conv2(x)), 2 ) x = x.view(x.size()[ 0 ], - 1 ) x = F.relu( self .fc1(x)) x = F.relu( self .fc2(x)) x = self .fc3(x) return x if __name__ = = "__main__" : net = LeNet() # #########训练网络######### from torch import optim # 初始化Loss函数 & 优化器 loss_fn = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr = 0.001 , momentum = 0.9 ) for epoch in range ( 2 ): running_loss = 0.0 for step, data in enumerate (trainloader, 0 ): # step为训练次数, trainloader包含batch的数据和标签 inputs, labels = data inputs, labels = t.autograd.Variable(inputs), t.autograd.Variable(labels) # 梯度清零 optimizer.zero_grad() # forward outputs = net(inputs) # backward loss = loss_fn(outputs, labels) loss.backward() # update optimizer.step() running_loss + = loss.data[ 0 ] if step % 2000 = = 1999 : print ( "[{0:d}, {1:5d}] loss: {2:3f}" . format (epoch + 1 , step + 1 , running_loss / 2000 )) running_loss = 0. print ( "Finished Training" ) |
这是使用LeNet分类cifar_10的例子,数据处理部分由于不是重点,没有列上来,主要是对使用torch分类有一个直观理解,
初始化网络
初始化Loss函数 & 优化器
进入step循环:
梯度清零
向前传播
计算本次Loss
向后传播
更新参数
由于pytorch的网络是class,所以在不考虑持久化的情况下,后续处理都不是太难,值得一提的是预测函数,我们直接net(Variable(test_data))即可,输出是概率分布的Variable,我们只要调用:
_, predict = t.max(test_out, 1)
即可,这是因为当指定了dim时,torch.max会融合max和argmax的功能,
>> a = torch.randn(4, 4)
>> a
0.0692 0.3142 1.2513 -0.5428
0.9288 0.8552 -0.2073 0.6409
1.0695 -0.0101 -2.4507 -1.2230
0.7426 -0.7666 0.4862 -0.6628
torch.FloatTensor of size 4x4]
>>> torch.max(a, 1)
(
1.2513
0.9288
1.0695
0.7426
[torch.FloatTensor of size 4]
,
2
0
0
0
[torch.LongTensor of size 4]
)
其他torch的高级功能没有使用到,本篇的目的是对于torch神经网络基本的使用有个理解。
标签:
PyTorch
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统