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

构建经典PyTorch框架卷积神经网络参数demo

构建经典PyTorch框架卷积神经网络参数demo

构建经典PyTorch框架卷积神经网络参数demo

  • 构建经典PyTorch框架卷积神经网络参数demo
  • 前言
    • 一、定义超参数
    • 二、数据集
    • 三、定义卷积网络模型
    • 四、 验证准确率
    • 五、 完整代码实现
  • 总结


在这里插入图片描述

前言

一、定义超参数

  1. 图像的总尺寸 28 * 28
    input_size = 28;

  2. 标签的种类数
    num_classses = 10;

  3. 训练的总循环周期
    num_epochs = 3;

  4. 一个最(批次)的大小 64张图片
    batch_size = 64;

二、数据集

# 训练集 
train_dataset = datasets.MNIST('data/', download=True, train=True, transform=transforms.ToTensor());# 测试集
test_dataset = datasets.MNIST('data/', download=True, train=False, transform=transforms.ToTensor());# 构建batch数据train_loader  = torch.utils.data.DataLoader(dataset = train_dataset,batch_size = batch_size,shuffle=True);test_loader = torch.utils.data.DataLoader(dataset = test_dataset,batch_size = batch_size,shuffle=True);

三、定义卷积网络模型

  1. Conv2d
  2. ReLU
  3. 池化

class  CNN(nn.Module):def __init__(self):super(CNN, self).__init__();self.conv1 = nn.Sequential(          # 输入大小 (1, 28, 28)# 2D卷积9nn.Conv2d(in_channels = 1,             # 灰度图out_channels = 16,           # 要得到几多少个特征图kernel_size = 5,             # 卷积核大小stride = 1,                  # 步长padding = 2,                 # 如果希望卷积后大小更原来一样 需要设置padding=(kernel_size-1)/2 if stride = 1),                               # 输出的特征图为(16, 28, 28)nn.ReLU(),                       # relu层nn.MaxPool2d(kernel_size = 2),   # 进行池化操作(2*2区域) 输出结果为(16, 14, 14););self.conv2 = nn.Sequential(           # 下一个套餐的输入(16, 14, 14)nn.Conv2d(16, 32, 5, 1, 2),       # 输出(32, 14, 14)nn.ReLU(),                        # relu层nn.Conv2d(32, 32, 5, 1, 2),       # nn.ReLU(),nn.MaxPool2d(2),                  # 输出(32, 7, 7));self.conv3 = nn.Sequential(           # 下一个套餐的输入(16, 14, 14)nn.Conv2d(32, 64, 5, 1, 2),       # 输出(32, 14, 14)nn.ReLU(),                        # 输出 (32, 7, 7));self.out = nn.Linear(64 * 7 * 7, 10);    # 全连接层得到的结果# 前向传播def forward(self, x):x = self.conv1(x);x = self.conv2(x);x = self.conv3(x);x = x.view(x.size(0), -1);             # flatten 操作 结果为:(batch_size, 32 * 7 * 7)output = self.out(x); return output;

四、 验证准确率

  # 实例化net = CNN();# 损失函数
criterion = nn.CrossEntropyLoss();# 优化器    定义优化器 普通的随机梯度下降算法   lr : 学习率
optimizer  = optim.Adam(net.parameters(), lr=0.001);# 开始训练循环
for epoch in range(num_epochs):# 当前epoch的结果保存下来train_rights = [];#针对容器中的每一个批进行循环for batch_idx, (data, target) in enumerate(train_loader): net.train();output = net(data);loss = criterion(output, target);optimizer.zero_grad();loss.backward();optimizer.step();right = accuracy(output, target);train_rights.append(right);if batch_idx % 100 == 0:net.eval();val_rights = [];for (data, target) in test_loader:output = net(data);right = accuracy(output, target);val_rights.append(right);# 准确率计算train_r = (sum([tup[0] for tup in train_rights]), sum([tup[1] for tup in train_rights]));val_r =  (sum([tup[0] for tup in val_rights]), sum([tup[1] for tup in val_rights]));print('当前epoch:{} [{}/{} ({:.0f}%)]\t 损失: {:.6f}\t 训练集准确率:{:.2f}%\t 测试集准确率:{:.2f}%'.format(epoch, batch_idx * batch_size, len(train_loader.dataset),100. * batch_idx / len(train_loader),loss.data,100. *train_r[0].numpy() / train_r[1],100. * val_r[0].numpy() / val_r[1]));

五、 完整代码实现

## 基本环境import torch;
import torch.nn as nn;
import torch.optim as optim;
import torch.nn.functional as F;
#  datasets  处理数据集
#  transforms 预处理操作的
from torchvision import datasets, transforms;
import matplotlib.pyplot as plt;
import numpy as np;#%matplotlib inline# 定义超参数#  1.  图像的总尺寸 28 * 28
input_size = 28; 
#  2. 标签的种类数
num_classses = 10;# 3. 训练的总循环周期
num_epochs = 3;
# 4. 一个最(批次)的大小 64张图片
batch_size = 64;# 训练集 
train_dataset = datasets.MNIST('data/', download=True, train=True, transform=transforms.ToTensor());# 测试集
test_dataset = datasets.MNIST('data/', download=True, train=False, transform=transforms.ToTensor());# 构建batch数据train_loader  = torch.utils.data.DataLoader(dataset = train_dataset,batch_size = batch_size,shuffle=True);test_loader = torch.utils.data.DataLoader(dataset = test_dataset,batch_size = batch_size,shuffle=True);# 定义卷积网络模型class  CNN(nn.Module):def __init__(self):super(CNN, self).__init__();self.conv1 = nn.Sequential(          # 输入大小 (1, 28, 28)# 2D卷积9nn.Conv2d(in_channels = 1,             # 灰度图out_channels = 16,           # 要得到几多少个特征图kernel_size = 5,             # 卷积核大小stride = 1,                  # 步长padding = 2,                 # 如果希望卷积后大小更原来一样 需要设置padding=(kernel_size-1)/2 if stride = 1),                               # 输出的特征图为(16, 28, 28)nn.ReLU(),                       # relu层nn.MaxPool2d(kernel_size = 2),   # 进行池化操作(2*2区域) 输出结果为(16, 14, 14););self.conv2 = nn.Sequential(           # 下一个套餐的输入(16, 14, 14)nn.Conv2d(16, 32, 5, 1, 2),       # 输出(32, 14, 14)nn.ReLU(),                        # relu层nn.Conv2d(32, 32, 5, 1, 2),       # nn.ReLU(),nn.MaxPool2d(2),                  # 输出(32, 7, 7));self.conv3 = nn.Sequential(           # 下一个套餐的输入(16, 14, 14)nn.Conv2d(32, 64, 5, 1, 2),       # 输出(32, 14, 14)nn.ReLU(),                        # 输出 (32, 7, 7));self.out = nn.Linear(64 * 7 * 7, 10);    # 全连接层得到的结果# 前向传播def forward(self, x):x = self.conv1(x);x = self.conv2(x);x = self.conv3(x);x = x.view(x.size(0), -1);             # flatten 操作 结果为:(batch_size, 32 * 7 * 7)output = self.out(x); return output;# 准确率def accuracy(predictions, labels):pred = torch.max(predictions.data, 1)[1];# 预测值与标签是否相等的rights = pred.eq(labels.data.view_as(pred)).sum();return rights, len(labels);# 实例化net = CNN();# 损失函数
criterion = nn.CrossEntropyLoss();# 优化器    定义优化器 普通的随机梯度下降算法   lr : 学习率
optimizer  = optim.Adam(net.parameters(), lr=0.001);# 开始训练循环
for epoch in range(num_epochs):# 当前epoch的结果保存下来train_rights = [];#针对容器中的每一个批进行循环for batch_idx, (data, target) in enumerate(train_loader): net.train();output = net(data);loss = criterion(output, target);optimizer.zero_grad();loss.backward();optimizer.step();right = accuracy(output, target);train_rights.append(right);if batch_idx % 100 == 0:net.eval();val_rights = [];for (data, target) in test_loader:output = net(data);right = accuracy(output, target);val_rights.append(right);# 准确率计算train_r = (sum([tup[0] for tup in train_rights]), sum([tup[1] for tup in train_rights]));val_r =  (sum([tup[0] for tup in val_rights]), sum([tup[1] for tup in val_rights]));print('当前epoch:{} [{}/{} ({:.0f}%)]\t 损失: {:.6f}\t 训练集准确率:{:.2f}%\t 测试集准确率:{:.2f}%'.format(epoch, batch_idx * batch_size, len(train_loader.dataset),100. * batch_idx / len(train_loader),loss.data,100. *train_r[0].numpy() / train_r[1],100. * val_r[0].numpy() / val_r[1]));

运行效果图

在这里插入图片描述

总结

人工智能深度学习:https://github.com/chensongpoixs/cdeeplearning_pytorch

http://www.dtcms.com/a/336174.html

相关文章:

  • WPF真入门教程35--手搓WPF出真汁【蜀味正道CS版】
  • 中国三大主粮作物(水稻、小麦、玉米)空间分布数据集
  • Python开发环境
  • 密码学系列 - 零知识证明(ZKP) - 多种承诺方案
  • Windows Server SDN智能流量管理方案
  • 网络通信的基本概念与设备
  • 【力扣热题100】双指针—— 接雨水
  • Ubuntu22系统docker部署Dify【教程】
  • go资料汇总
  • 上网行为组网方案
  • 图论水题4
  • 隐私屏软件(支持win10以上系统)
  • Python异常、模块与包(五分钟小白从入门)
  • Android面试指南(二)
  • 工具测试 - marker (Convert PDF to markdown + JSON quickly with high accuracy)
  • JavaScript 中constructor 属性的指向异常问题
  • Python实现区域生长和RANSAC聚类
  • 线程基本API
  • 输入坐标移动
  • 在线编程题目之小试牛刀
  • 多线程—飞机大战(加入排行榜功能版本)
  • 数字化转型成功案例:赋能供应链运输成本精细化管理
  • 网络编程3(网络层,数据链路层)
  • 批次号规则
  • Vue中v-show与v-if的区别
  • 【AI论文】序曲(PRELUDE):一项旨在考察对长文本语境进行全局理解与推理能力的基准测试
  • C语言私人学习笔记分享
  • STM32单片机学习日记
  • 第四章:大模型(LLM)】06.langchain原理-(7)LangChain 输出解析器(Output Parser)
  • 模型提取的相关经验