PyTorch学习9:卷积神经网络

文章目录

  • 前言
  • 一、说明
  • 二、具体实例
    • 1.程序说明
    • 2.代码示例
  • 总结


前言

介绍卷积神经网络的基本概念及具体实例

一、说明

1.如果一个网络由线性形式串联起来,那么就是一个全连接的网络。
2.全连接会丧失图像的一些空间信息,因为是按照一维结构保存。CNN是按照图像原始结构进行保存数据,不会丧失,可以保留原始空间信息。
3.图像卷积后仍是一个三维张量。
4.subsampling(下采样)后通道数不变,但是图像的高度和宽度变,减少数据数量,降低运算需求。
5.卷积运算示意图
在这里插入图片描述
6.padding参数:在输入外面再套圈,用0填充。
7.stride参数:做卷积操作时的步长。
8.下采样通常采用最大池化层,通道数量不变,图像宽和高改变。

二、具体实例

1.程序说明

输入尺寸为1*28*28,经过10个1*5*5的卷积操作变为10*24*24;经过2*2的最大池化变为10*12*12;经过20个10*5*5的卷积操作变为20*8*8;经过2*2的最大池化变为20*4*4;变为一维320个向量,再经过全连接层变为10个向量。

2.代码示例

代码如下(示例):

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
import pickle

# prepare dataset


# design model using class


class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)
        self.pooling = torch.nn.MaxPool2d(2)
        self.fc = torch.nn.Linear(320, 10)

    def forward(self, x):
        # flatten data from (n,1,28,28) to (n, 784)
        batch_size = x.size(0)
        x = F.relu(self.pooling(self.conv1(x)))
        x = F.relu(self.pooling(self.conv2(x)))
        x = x.view(batch_size, -1)  # -1 此处自动算出的是320
        x = self.fc(x)

        return x





# training cycle forward, backward, update


def train(epoch):
    running_loss = 0.0
    loss_s = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        inputs, target = data
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        loss_s += loss.item()
        if batch_idx % 300 == 299:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))
            running_loss = 0.0
    return loss_s / len(train_loader)


def test():
    correct = 0
    total = 0
    with torch.no_grad():
        for data in test_loader:
            images, labels = data
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('accuracy on test set: %d %% ' % (100 * correct / total))
    return 100 * correct / total


if __name__ == '__main__':
    batch_size = 64
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])

    train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True, download=True, transform=transform)
    train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
    test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False, download=True, transform=transform)
    test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)

    model = Net()

    # construct loss and optimizer
    criterion = torch.nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

    epoch_list = []
    loss_list = []
    accuracy_list = []
    for epoch in range(10):
        epoch_list.append(epoch)
        loss_lis=train(epoch)
        loss_list.append(loss_lis)
        tes=test()
        accuracy_list.append(tes)
        with open('9/epoch_list.pkl', 'wb') as f:
            pickle.dump(epoch_list, f)
        with open('9/loss_list.pkl', 'wb') as f:
            pickle.dump(loss_list, f)
        with open('9/accuracy_list.pkl', 'wb') as f:
            pickle.dump(accuracy_list, f)

画图程序如下:

import pickle
import matplotlib.pyplot as plt

with open('9/epoch_list.pkl', 'rb') as f:
    loaded_epoch_list = pickle.load(f)
with open('9/loss_list.pkl', 'rb') as f:
    loaded_loss_list = pickle.load(f)
with open('9/accuracy_list.pkl', 'rb') as f:
    loaded_acc_list = pickle.load(f)

plt.subplot(2, 1, 1)  # 创建子图,2行1列,第1个子图
plt.plot(loaded_epoch_list, loaded_loss_list)
plt.xlabel('epoch')
plt.ylabel('loss 1')


plt.subplot(2, 1, 2)  # 创建子图,2行1列,第2个子图
plt.plot(loaded_epoch_list, loaded_acc_list,'r')
plt.xlabel('epoch')
plt.ylabel('acc 1')
plt.show()

得到如下结果:
在这里插入图片描述
在这里插入图片描述

利用GPU运行的程序如下:

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
import pickle
import time
# prepare dataset


# design model using class


class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)
        self.pooling = torch.nn.MaxPool2d(2)
        self.fc = torch.nn.Linear(320, 10)

    def forward(self, x):
        # flatten data from (n,1,28,28) to (n, 784)
        batch_size = x.size(0)
        x = F.relu(self.pooling(self.conv1(x)))
        x = F.relu(self.pooling(self.conv2(x)))
        x = x.view(batch_size, -1)  # -1 此处自动算出的是320
        x = self.fc(x)

        return x





# training cycle forward, backward, update


def train(epoch):
    running_loss = 0.0
    loss_s = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        inputs, target = data
        inputs, target = inputs.to(device), target.to(device)
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        loss_s += loss.item()
        if batch_idx % 300 == 299:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))
            running_loss = 0.0
    return loss_s / len(train_loader)


def test():
    correct = 0
    total = 0
    with torch.no_grad():
        for data in test_loader:
            images, labels = data
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('accuracy on test set: %d %% ' % (100 * correct / total))
    return 100 * correct / total


if __name__ == '__main__':
    start_time = time.time()
    batch_size = 64
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])

    train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True, download=True, transform=transform)
    train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
    test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False, download=True, transform=transform)
    test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)

    model = Net()
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)

    # construct loss and optimizer
    criterion = torch.nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

    epoch_list = []
    loss_list = []
    accuracy_list = []
    for epoch in range(10):
        epoch_list.append(epoch)
        loss_lis=train(epoch)
        loss_list.append(loss_lis)
        tes=test()
        accuracy_list.append(tes)
        with open('9/epoch_list.pkl', 'wb') as f:
            pickle.dump(epoch_list, f)
        with open('9/loss_list.pkl', 'wb') as f:
            pickle.dump(loss_list, f)
        with open('9/accuracy_list.pkl', 'wb') as f:
            pickle.dump(accuracy_list, f)
    end_time = time.time()

    print('training time: %.2f s' % (end_time - start_time))

得到如下结果:
在这里插入图片描述

在这里插入图片描述

总结

PyTorch学习9:卷积神经网络

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rtl8723du android5.1 6818 (蓝牙 部分)(第四部分)

系统使用的是,android5.1 , 蓝牙驱动就要使用 V5.6,而不是V5.2 了。 由于 在原来的SDK中 蓝牙使用的是 mt6620 uart 接口。 所以在移植的过程中,顺带把之前的驱动去掉。 1 关于kernel 的修改。 拷贝驱动。 修改Kconfig 修改Makefile 拷贝 uhid dirver 拷贝 uhid.c 拷贝…

无需插件脚本,IDEA配置多服务一键启动

分享本教程的初衷是本人在本地调试时业务场景中需要调用多个服务,并且每次为了找到需要启动的服务花了很多不必要的时间,我相信很多同为开发的小伙伴也有和我一样的困扰。但是学会这招后多个服务需要同时启动时仅需一键即可搞定。接下来让我们一步步设置…

IDEA:开发配置(2024版 建议收藏)

文章目录 一、下载IDEA二、开发配置2.1 Maven仓库2.2 自动导包2.3 字符编码2.4 注释颜色2.6 鼠标滚轮控制代码大小2.7 关闭自动更新2.8 主题、字体和字体大小2.9 关闭usages提示 三、常用插件3.1 chinese(中文汉化)3.2 主题插件3.2.1 One Dark Theme&…

buuctf-findKey

exe文件 运行发现这个窗口,没有任何消息 32位 进入字符串就发现了flag{ 左边红色代表没有F5成功 我们再编译一下(选中红色的全部按p) LRESULT __stdcall sub_401640(HWND hWndParent, UINT Msg, WPARAM wParam, LPARAM lParam) {int v5; // eaxsize_t v6; // eaxDWORD v7; /…

录音转文字怎么弄?用转文字工具让你快速整理会议纪要

端午节活动精彩落幕,紧接着的回顾会议也圆满结束。 在这次会议上,我们收集了许多宝贵意见,但手写记录耗时且易遗漏。为了提高效率,我们急需一款能快速准确转换会议音频为文字的软件。 那么,市面上有哪些录音转文字软…

六西格玛培训都培训哪些内容 ?

天行健六西格玛培训的内容通常涵盖多个方面,旨在帮助学员全面理解和应用六西格玛管理方法。以下是详细的培训内容概述: 一、六西格玛基础知识 引入六西格玛的概念、原理和历史,包括DMAIC(定义、测量、分析、改进、控制&#xff0…

[Python学习篇] Python输入

关键字 input 语法:input("提示信息") 特点 当程序执行到input,等待用户输入,输入完成之后才能继续向下执行。input接收用户输入后,一般存储到变量中,方便使用。input会把接收到的任意用户输入的数据都当做…

数据结构习题(快期末了)

一个数据结构是由一个逻辑结构和这个逻辑结构上的一个基本运算集构成的整体。 从逻辑关系上讲,数据结构主要分为线性结构和非线性结构两类。 数据的存储结构是数据的逻辑结构的存储映像。 数据的物理结构是指数据在计算机内实际的存储形式。 算法是对解题方法和…

(Git)多人协作1

文章目录 前言总结 前言 目标:master分支下file.txt文件新增“aaa”,“bbb” 实现:开发者1新增“aaa”,开发者2新增“bbb” 条件:在同一个分支下协作完成 实际开发过程中,每个用户都与属于自己的码云账户,如果想要进…

C语言----字符函数和字符串函数

在编程的过程中,我们要经常处理字符和字符串,为了方便操作字符和字符串,c语言标准库中提供的一系列库函数,接下来我们就开始学习与认识他们 1.字符分类函数 c语言中有一系列的函数是专门做字符分类的,也就是一个字符…

多模态融合:CLIP

CLIP的全称是Contrastive Language-Image Pre-Training,中文是对比语言-图像预训练,是一个预训练模型,简称为CLIP。CLIP一共有两个模态,一个是文本模态,一个是视觉模态,分别对应了Text Encoder和Image Enco…

资源不是问题,极空间全自动小雅Alist以及Emby全家桶部署教程,同时实现自动更新

资源不是问题,极空间全自动小雅Alist以及Emby全家桶部署教程,同时实现自动更新 哈喽小伙伴,我是Stark-C~ 在上次更新了极空间虚拟机教程之后,终于有小伙伴催更了小雅Alist的搭建方案。作为当前市面最强、最大、最全的影视资源合…

MySQL-----排序 GROUP BY

在我们对数据进行分析的时候,通常会根据一个或多个列对结果集进行分组,从而得到我们想要的结果。例如:统计考某一门课程的学生信息等。 而MySQL的GROUP BY 语句根据一个或多个列对结果集进行分组。同时,我们也可以使用 COUNT, SUM…

Kubernetes 集群架构

etcd 集群状态存储:etcd 存储所有 Kubernetes 对象的状态,例如部署、pod、服务、配置映射和机密。配置管理:集群配置的更改存储在 etcd 中,允许 Kubernetes 管理和维护集群的所需状态。 注意:etcd 可能位于 kube-syst…

GBDT算法超参数评估

GBDT(Gradient Boosting Decision Tree)算法是一种强大的机器学习技术,广泛应用于分类、回归等任务。然而,为了充分发挥其性能,超参数的合理设置至关重要。超参数,如学习率、树的最大深度、子样本比例等&am…

尝试使用blazor(二)Blazor WebAssembly(WASM)与Server之间有什么区别?

要使用Blazor,你得先选择一种模式,因为它有两种模式。Blazor网络框架允许将Razor组件以不同的方式托管。它们可以在ASP.NET Core(Blazor Server)中在服务器端运行,也可以在基于WebAssembly的.NET运行时在浏览器中在客户…

便捷生活,从便民平台开始

想要生活更轻松、更便捷吗?那就来试试我们的便民平台吧!生活中的琐事总是让人头疼不已,但有了我们的便民平台,一切问题都迎刃而解! 咸阳便民平台的张总说:无论您是需要家政服务、维修安装,还是寻…

支持微信支付宝账单,极空间Docker部署一个开箱即用的私人账本『cashbook』

支持微信支付宝账单,Docker部署一个开箱即用的私人账本『cashbook』 哈喽小伙伴好,我是Stark-C~ 不知道屏幕前的各位富哥富姐们有没有请一个专业的私人财务助理管理自己的巨额资产,我不是给大家炫耀,我在月薪300的时候就已经有了…

ICC2:如何获取get_xx -filter后可用的属性有哪些?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 report_attribute -app -class cell $instname 这种直接告诉你指定cell有哪些属性,以及对应的值是什么 或者直接用list_attribute也可以 list_attribute -help可以…

STM32自己从零开始实操05:接口电路原理图

一、TTL 转 USB 驱动电路设计 1.1指路 延续使用芯片 CH340E 。 实物图 原理图与封装图 1.2数据手册重要信息提炼 1.2.1概述 CH340 是一个 USB 总线的转接芯片,实现 USB 与串口之间的相互转化。 1.2.2特点 支持常用的 MODEM 联络信号 RTS(请求发送&…