Pytorch深度学习实践(9)卷积神经网络

news2024/11/20 16:35:50

卷积神经网络

全连接神经网络

神经网络中全部是线性模型,是由线性模型串联起来的

全连接网络又叫全连接层

卷积神经网络

在全连接神经网络中,由于输入必须是一维向量,因此在处理图像时必须要对图像矩阵进行拉伸成一维的形式,这必然会导致损失一些空间信息

为了保证空间信息的完整性,因此我们需要使用卷积神经网络,直接出入图片,进行模型训练

基本步骤如下:

输入 – 卷积 – 下采样 – 卷积 – 下采样 – 全连接层 – 输出

在这里插入图片描述

其中,卷积和下采样工作称为特征提取 feature extraction,全连接层的工作叫做分类器 classification

图像

图像分为三个维度:

  • 通道(rgb

即表示为 C × H × W C×H×W C×H×W

卷积的运算

单通道卷积

在输入中,拿出和卷积核大小一致的矩阵,与卷积核进行数乘,让后放到输出的第一个单元格内
在这里插入图片描述

然后使用卷积核依次对输入进行遍历,最终填满所有的输出

在这里插入图片描述

多通道卷积

每一个通道都配有一个卷积核,对每个通道进行卷积操作,最后把所有通道的输出进行相加,得到最终的输出

原始图像几个通道,卷积核就要有几层

在这里插入图片描述

对于多通道图像,图像可以看作是立体的,卷积核也可以看作是立体的,经过卷积之后把各通道的输出相加,最终得到一个二维的张量
在这里插入图片描述

为了在训练过程中使得输出也具有多个通道,因此使用多个3维的卷积核

在这里插入图片描述

卷积层的设计

卷积核

三要素:

  • 输入的通道数
  • 输出的通道数
  • 卷积核尺寸的大小
# 实例化卷积层
conv_layer = torch.nn.Conv2d(in_channels, out_channels, kernel_size = kernel_size)
# 设置卷积核权重 (batch_sie, channel, w, h) = (1, 1, 3, 3)
kernel = torch.Tensor([1, 2, 3, 4, 5, 6, 7, 8, 9]).view(1, 1, 3, 3)
conv_layer.weight.data = kernel.data

通过卷积核后输出的大小: m × n × k e r n e l _ s i z e w i d t h × k e r n e l _ s i z e h e i g h t m×n×kernel\_size_{width}×kernel\_size_{height} m×n×kernel_sizewidth×kernel_sizeheight

其中, m m m为批量 b a t c h batch batch大小, n n n为通道数

padding填充

通过设置padding,即对原始图像进行填充,进而控制输出的大小,填充的部分一般默认用0代替

在这里插入图片描述

一般来说,如果卷积核是 3 × 3 3×3 3×3,则padding一圈,如果卷积核是 5 × 5 5×5 5×5,则padding两圈

卷积核大小为 n × n,则padding n / 2 n / 2 n/2(整除)圈

conv_layer = torch.nn.Conv2d(in_channels,  # 输入通道数
                             out_channels, # 输出通道数
                             kernel_size = kernel_size, # 卷积核大小
                             padding = 1,  # 填充层数
                             bias = False) # 不使用偏置

stride步长

每次遍历原始图像时的步长,可以有效地降低图像的宽度和高度

conv_layer = torch.nn.Conv2d(1, 1,
                             kernel_size = 3, # 卷积核大小
                             padding = 1,  # 填充层数
                             stride=2,  #步长
                             bias = False) # 不使用偏置

下采样

一般使用最大池化层,即MaxPooling

最大池化层步长默认大小为 2 × 2 2×2 2×2

先将输入按照步长大小分割,形成多个部分,然后再在各个部分中取最大值,作为输出
在这里插入图片描述

maxpooling_layer = torch.nn.MaxPool2d(kernel_size=2)

代码实战

使用卷积神经网络处理MNIST

构造卷积神经网络如下所示:
在这里插入图片描述

  • 卷积层不需要知道输入输出的大小
  • 但最后的全连接层(线性模型)需要定义输出输出的大小

在这里插入图片描述

不使用GPU版本

import torch
import matplotlib.pyplot as plt
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F

########## 准备数据集 ##########
batch_size = 64
## 实例化转换器
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST(root='./dataset/mnist/',
                               train=True,
                               download=False,
                               transform=transform)
train_loader = DataLoader(train_dataset,
                          shuffle=True,
                          batch_size=batch_size)
test_dataset = datasets.MNIST(root='./dataset/mnist/',
                              train=False,
                              download=False,
                              transform=transform)
test_loader = DataLoader(test_dataset, batch_size=batch_size)

########## 定义模型 ##########
class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5) # 卷积层1
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5) # 卷积层2
        self.pooling = torch.nn.MaxPool2d(2)  # 池化层
        self.fc = torch.nn.Linear(320, 10)  # 全连接层

    def forward(self, x):
        batch_size = x.size(0)
        ## 先输入卷积层 在输入池话层 最后输入到relu中做非线性变换
        # 1
        x = F.relu(self.pooling(self.conv1(x)))
        # 2
        x = F.relu(self.pooling(self.conv2(x)))
        ## 全连接层
        # 先把输入平铺 flatten 操作
        x = x.view(batch_size, -1)
        x = self.fc(x)
        return x

model = Net()

########## 损失函数核优化器定义 ##########
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01, momentum=0.5)

########## 模型训练 ##########
def train(epoch):
    running_loss = 0.0
    for batch_index, data in enumerate(train_loader, 0):
        inputs, target = data
        optimizer.zero_grad()

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

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

########## 模型测试 ##########
def test():
    correct = 0
    total = 0
    with torch.no_grad():
        for data in test_loader:
            inputs, target = data
            outputs = model(inputs)
            _, predicted = torch.max(outputs.data, dim=1)
            total += target.size(0)
            correct += (predicted == target).sum().item()
    print('Accuracy on test set: %d %%' % (100 * correct / total))
    return 100 * correct / total

######### main ##########
if __name__ == '__main__':
    accuracy_history = []
    epoch_history = []
    for epoch in range(50):
        train(epoch)
        accuracy = test()
        accuracy_history.append(accuracy)
        epoch_history.append(epoch)
    plt.plot(epoch_history, accuracy_history)
    plt.xlabel('epoch')
    plt.ylabel('accuracy(%)')
    plt.show()

使用GPU版本

  • 设置模型训练设备

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    
  • 把模型放入GPU

    model.to(device)
    
  • 把数据放入GPU

    inputs, target = inputs.to(device), target.to(device)
    
import torch
import matplotlib.pyplot as plt
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F

########## 准备数据集 ##########
batch_size = 64
## 实例化转换器
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST(root='./dataset/mnist/',
                               train=True,
                               download=False,
                               transform=transform)
train_loader = DataLoader(train_dataset,
                          shuffle=True,
                          batch_size=batch_size)
test_dataset = datasets.MNIST(root='./dataset/mnist/',
                              train=False,
                              download=False,
                              transform=transform)
test_loader = DataLoader(test_dataset, batch_size=batch_size)

########## 定义模型 ##########
class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5) # 卷积层1
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5) # 卷积层2
        self.pooling = torch.nn.MaxPool2d(2)  # 池化层
        self.fc = torch.nn.Linear(320, 10)  # 全连接层

    def forward(self, x):
        batch_size = x.size(0)
        ## 先输入卷积层 在输入池话层 最后输入到relu中做非线性变换
        # 1
        x = F.relu(self.pooling(self.conv1(x)))
        # 2
        x = F.relu(self.pooling(self.conv2(x)))
        ## 全连接层
        # 先把输入平铺 flatten 操作
        x = x.view(batch_size, -1)
        x = self.fc(x)
        return x

model = Net()
## 使用gpu
if torch.cuda.is_available():
    print("使用gpu训练")
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
## 将模型放入设备
model.to(device)
########## 损失函数核优化器定义 ##########
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01, momentum=0.5)

########## 模型训练 ##########
def train(epoch):
    running_loss = 0.0
    for batch_index, data in enumerate(train_loader, 0):
        inputs, target = data
        ## 将数据放入设备
        inputs, target = inputs.to(device), target.to(device)
        optimizer.zero_grad()

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

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

########## 模型测试 ##########
def test():
    correct = 0
    total = 0
    with torch.no_grad():
        for data in test_loader:
            inputs, target = data
            ## 将数据放入设备
            inputs, target = inputs.to(device), target.to(device)
            outputs = model(inputs)
            _, predicted = torch.max(outputs.data, dim=1)
            total += target.size(0)
            correct += (predicted == target).sum().item()
    print('Accuracy on test set: %d %%' % (100 * correct / total))
    return 100 * correct / total

######### main ##########
if __name__ == '__main__':
    accuracy_history = []
    epoch_history = []
    for epoch in range(50):
        train(epoch)
        accuracy = test()
        accuracy_history.append(accuracy)
        epoch_history.append(epoch)
    plt.plot(epoch_history, accuracy_history)
    plt.xlabel('epoch')
    plt.ylabel('accuracy(%)')
    plt.show()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视觉巡线小车(STM32+OpenMV)——总结

文章目录 目录 文章目录 前言 一、效果展示 二、完整流程 1、STM32CubeMX配置 2、Keil编辑 3、硬件接线 4、参数调试 5、图像处理调试 三、总结 前言 基于前面的系列文章,已基本介绍完了基于STM32OpenMV的视觉巡线小车,本文将以小编自己的小车…

BACnet物联网关BL103:Modbus协议转BACnet/MSTP

随着物联网技术在楼宇自动化与暖通控制系统中的迅猛发展,构建一种既经济高效又高度可靠的协议转换物联网关成为了不可或缺的核心硬件组件。在此背景下,我们钡铼特别推荐一款主流的BAS(楼宇自动化系统)与BACnet物联网关——BL103&a…

小世界特性解析——聚类系数与平均路径长度的奥秘

小世界特性解析——聚类系数与平均路径长度的奥秘 小世界特性的核心衡量指标 小世界特性,这一复杂网络中的重要概念,主要通过两个关键指标来衡量:聚类系数和平均路径长度。这两个指标共同揭示了网络结构的紧密程度和信息传播的效率。 聚类…

echarts没数据的时候,页面显示暂无数据

echarts没数据的时候,页面显示暂无数据 给个if判断 let option{} if(data.length0){ //没有数据或者数据不合法,显示暂无数据option {title: {text: 暂无数据,x: center,y: center,textStyle: {fontFamily: Manteka,fontSize: 12,fontWeight: normal,color: #333…

使用 Copilot 对 OneDrive 文档分享进行摘要

对于大量使用onedrive进行资料分享的用户而言,对分享的文件进行简要说明并提供给对方,是一个基本素养。 在以往,他们只能阅读文件名然后靠回忆进行撰写,或者打开每一个文档通读全文然后再关闭返回并撰写摘要。 当用户在 SharePo…

Java聚合快递小程序对接云洋系统程序app源码

​一场物流效率的革命 引言:物流新时代的序章 在数字化浪潮席卷各行各业的今天,物流行业也迎来了前所未有的变革。为了进一步提升物流效率,优化用户体验,聚合快递系统与云洋系统小程序的对接成为了行业内外关注的焦点。这一创新…

基于JSP的毕业生就业信息管理系统

你好,我是专注于信息系统开发的码农小野!如果你对毕业生就业信息管理有需求,欢迎联系我。 开发语言:JSP 数据库:MySQL 技术:JSP技术 SSM框架 工具:Eclipse、Maven、Navicat 系统展示 首页…

登录案例(JAVA)

练习1 package lx2;import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class demo1 {/*需求:写一个登陆小案例。步骤…

Hive环境搭建(内置数据库)

实验目的】 1) 了解hive的作用 2) 熟练hive的配置过程(内置数据库) 【实验原理】 Hive的架构是由Client、Metastore、Driver、Compiler构成,执行流程是编译器可以将一个Hive QL转换成操作符,操作符是Hive中的最小处理单元。…

【BUG】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10

UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 目录 UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#x…

torch fbgemm.dll 报错

这里写自定义目录标题 OSError: [WinError 126] The specified module could not be found. Error loading \"c:\\Users\\Noor\\anaconda3\\envs\\DL\\Lib\\site-packages\\torch\\lib\\fbgemm.dll\" or one of its dependencies."https://github.com/lucasg/De…

在VMware创建Ubuntu24

目录 一、创建虚拟机 1. 自定义创建虚拟机 2. 设置虚拟机兼容 3. 选择镜像 4. 命名虚拟机,选择存放位置 5. 处理器配置 6. 内存配置 7. 网络类型配置 8. I/O控制器类型 9. 磁盘配置 10. 完成虚拟机创建 二、Ubuntu安装 1. 进入虚拟机中进行ubuntu的安…

java算法day25

java算法day25 广度优先搜索岛屿数量深搜岛屿数量广搜 广度优先搜索 核心:从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。搜索的方式是上下左右 一张图说明白模拟过程&#xff1…

21.发布确认模式-高级

问题 生产环境中由于一些不明原因,导致rabbitmq重启,在重启的期间生产者消息投递失败,导致消息丢失,需要手动处理恢复。那么如何才能进行rabbitmq的消息可靠性投递?特别是在极端的情况,rabbitmq集群不可用…

从json到protobuf,接口效率的提升

在express开发的前后端调用中,express作为服务端是不二之选,它有一些很好用的body解析器来解析传入数据;而作为请求发起方,axios是非常方便的,这是一个很好的选择,它可以传输多种类型的数据给接收方。 通常…

ios生成打包证书和描述文件(保姆级)

苹果开发者地址:Apple Developer (简体中文) 1.申请苹果App ID(App的唯一标识) 选择App IDs 选择App 输入APP ID的描述和Bundle ID Explicit:唯一的ID,用于唯一标识一个应用程序,一般选Explicit WildCard:通配符ID&am…

【初阶数据结构篇】顺序表和链表算法题

文章目录 顺序表算法题移除元素删除有序数组中的重复项合并两个有序数组 链表算法题移除链表元素反转链表链表的中间结点合并两个有序链表链表分割链表的回文结构 顺序表算法题 不熟悉顺序表的可以先了解一下 顺序表实现方法 移除元素 给你一个数组 nums 和一个值 val&#x…

谷歌DeepMind的AlphaProof和AlphaGeometry 2:AI系统在国际数学奥林匹克竞赛中取得突破

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

管不住人,你就当不好官:一流高手的3大管人秘籍,价值千金

管不住人,你就当不好官:一流高手的3大管人秘籍,价值千金 秘籍一:睁眼法 古语有云:“水至清则无鱼,人至察则无友。” 驾驭下属,学会睁一只眼闭一只眼,不要一竿子打死,…

如何在GPU服务器上安装Stable Diffusion webUI

一、前提条件 1、硬件条件 GPU:12G,建议16G以上,还是尽量勾搭,好像现在最大32G,目前个人性价比24G有时长出售。 内存:16G以上,建议32G,也是越大越好。 硬盘:最好使用…