当前位置: 首页 > news >正文

LeNet

概念

代码

model

import torch.nn as nn
import torch.nn.functional as Fclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()  # super()继承父类的构造函数self.conv1 = nn.Conv2d(3, 16, 5)self.pool1 = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(16, 32, 5)self.pool2 = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(32*5*5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x): x = F.relu(self.conv1(x))    # input(3, 32, 32) output(16, 28, 28)x = self.pool1(x)            # output(16, 14, 14)x = F.relu(self.conv2(x))    # output(32, 10, 10)x = self.pool2(x)            # output(32, 5, 5)x = x.view(-1, 32*5*5)       # output(32*5*5)x = F.relu(self.fc1(x))      # output(120)x = F.relu(self.fc2(x))      # output(84)x = self.fc3(x)              # output(10)return x

forward:定义正向传播的过程。

ReLU:激活哈数

观察网络中的参数传递:发现传递的都是channel通道数,最后output在softmax函数里展开的也是展开的通道数。

train

import torch
import torchvision
import torch.nn as nn
from model import LeNet
import torch.optim as optim
import torchvision.transforms as transformsdef main():transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# 50000张训练图片# 第一次使用时要将download设置为True才会自动去下载数据集train_set = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)train_loader = torch.utils.data.DataLoader(train_set, batch_size=36,shuffle=True, num_workers=0)# 10000张验证图片# 第一次使用时要将download设置为True才会自动去下载数据集val_set = torchvision.datasets.CIFAR10(root='./data', train=False,download=False, transform=transform)val_loader = torch.utils.data.DataLoader(val_set, batch_size=5000,shuffle=False, num_workers=0)val_data_iter = iter(val_loader)val_image, val_label = next(val_data_iter)# classes = ('plane', 'car', 'bird', 'cat',#            'deer', 'dog', 'frog', 'horse', 'ship', 'truck')net = LeNet()loss_function = nn.CrossEntropyLoss()optimizer = optim.Adam(net.parameters(), lr=0.001)for epoch in range(5):  # loop over the dataset multiple timesrunning_loss = 0.0for step, data in enumerate(train_loader, start=0):# get the inputs; data is a list of [inputs, labels]inputs, labels = data# zero the parameter gradientsoptimizer.zero_grad()# forward + backward + optimizeoutputs = net(inputs)loss = loss_function(outputs, labels)loss.backward()optimizer.step()# print statisticsrunning_loss += loss.item()if step % 500 == 499:    # print every 500 mini-batcheswith torch.no_grad():outputs = net(val_image)  # [batch, 10]predict_y = torch.max(outputs, dim=1)[1]accuracy = torch.eq(predict_y, val_label).sum().item() / val_label.size(0)print('[%d, %5d] train_loss: %.3f  test_accuracy: %.3f' %(epoch + 1, step + 1, running_loss / 500, accuracy))running_loss = 0.0print('Finished Training')save_path = './Lenet.pth'torch.save(net.state_dict(), save_path)if __name__ == '__main__':main()

predict.py

import torch
import torchvision.transforms as transforms
from PIL import Imagefrom model import LeNetdef main():transform = transforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')net = LeNet()net.load_state_dict(torch.load('Lenet.pth'))im = Image.open('1.jpg').convert('RGB')im = transform(im)  # [C, H, W]im = torch.unsqueeze(im, dim=0)  # [N, C, H, W]with torch.no_grad():outputs = net(im)predict = torch.max(outputs, dim=1)[1].numpy()# predict = torch.softmax(outputs,dim=1)# print(predict)# tensor([[9.9884e-01, 1.9386e-04, 3.8757e-04, 2.0671e-05, 2.5372e-04, 3.6199e-05,# 3.7643e-05, 1.7624e-04, 2.0138e-05, 3.4801e-05]])print(classes[int(predict)])if __name__ == '__main__':main()

知识点:

增加新的维度: 

im = torch.unsqueeze(im, dim=0)  # [N, C, H, W] 

predict = torch.max(outputs, dim=1)[1].numpy():

这一行代码使用torch.max()函数找到outputs张量在第一个维度上的最大值,并返回最大值和对应的索引。dim=1表示在第一个维度上进行最大值的计算,即对每个样本的输出进行比较。[1]表示返回最大值对应的索引。最后,.numpy()将结果转换为NumPy数组。 

更换:

predict = torch.softmax(outputs,dim=1)

print:tensor([[9.9884e-01, 1.9386e-04, 3.8757e-04, 2.0671e-05, 2.5372e-04, 3.6199e-05,
         3.7643e-05, 1.7624e-04, 2.0138e-05, 3.4801e-05]])

Pytorch使用

http://www.lryc.cn/news/256266.html

相关文章:

  • JavaScript 简单理解原型和创建实例时 new 操作符的执行操作
  • 生成对抗网络——研讨会
  • Ubuntu 20.04 安装 mysql8 LTS
  • 蓝桥杯:货物摆放
  • ganache部署智能合约报错VM Exception while processing transaction: invalid opcode
  • 金融银行业更适合申请哪种SSL证书?
  • 文心一言API(高级版)使用
  • C# 任务并行类库Parallel调用示例
  • 2024年江苏省职业院校技能大赛信息安全管理与评估 第二阶段学生组(样卷)
  • 飞天使-linux操作的一些技巧与知识点3
  • Appium获取toast方法封装
  • Google Guava简析
  • 反序列化漏洞详解(二)
  • React全站框架Next.js使用入门
  • 【操作系统笔记】-文件系统
  • 第二十一章 网络通信
  • 【漏洞复现】万户协同办公平台ezoffice wpsservlet接口存在任意文件上传漏洞 附POC
  • 【uniapp】小程序中input输入框的placeholder-class不生效解决办法
  • SimplePIR——目前最快单服务器匿踪查询方案
  • Spring Boot中使用Swagger
  • uniapp实战 —— 竖排多级分类展示
  • SAP UI5 walkthrough step6 Modules
  • 时间相关类
  • 数据库事务:保障数据一致性的基石
  • 自动化操作脚本
  • MVC、MVP、MVVM模式的区别
  • 【Vue】日常错误总结(持续更新)
  • java多线程(常用方法、实现方式、线程安全问题、生命周期、线程池)
  • Day05 linux高级系统设计 - 管道
  • 低代码:美味膳食或垃圾食品?