b站小土堆pytorch学习记录—— P18-P22 神经网络+小实战

文章目录

  • 一、卷积层 P18
    • 1.卷积操作
    • 2.代码
  • 二、池化层 P19
    • 1.池化层简单介绍
    • 2.代码
      • (1)池化操作中数字的变化
      • (2)池化操作对图片的影响
  • 三、非线性激活 P20
    • 1.简要介绍
    • 2.代码
  • 四、线性层及其他层介绍 P21
    • 1.线性层
    • 2.代码
  • 五、搭建小实战和Sequential的使用 P22
    • 1.要实现的模型
    • 2.代码

理解神经网络:

卷积神经网络(CNN)详细介绍及其原理详解

CNN笔记:通俗理解卷积神经网络

一文让你彻底了解卷积神经网络

一、卷积层 P18

1.卷积操作

推荐几个高赞博客:

卷积最容易理解的解释
卷积神经网络(CNN)详细介绍及其原理详解
还有pytorch官网的动态图:
pytorch卷积

具体而言,假设有一个3X3的灰度图像矩阵:

[1, 1, 1]
[0, 0, 0]
[1, 1, 1]

我们使用一个称为边缘检测的卷积核(滤波器):

[-1, -1, -1]
[-1,  8, -1]
[-1, -1, -1]

接下来,我们将对这个3x3图像矩阵应用卷积操作。

步骤如下:

(1)将3x3的卷积核与图像的左上角3x3区域进行逐元素相乘,并将结果相加,得到新的像素值。
(2)滑动卷积核到下一个位置,再次进行相乘相加操作,得到另一个像素值。
(3)重复此过程直到覆盖整个图像。
应用以上步骤后,我们可以得到一个新的图像矩阵,其中包含了经过边缘检测卷积核处理后的结果。这种操作有助于检测图像中的边缘和轮廓。

具体计算如下:

第一步,将卷积核与图像的左上角3x3区域进行逐元素相乘,并将结果相加,得到新的像素值:

1*(-1) + 1*(-1) + 1*(-1) +
0*(-1) + 0*8 + 0*(-1) +
1*(-1) + 1*(-1) + 1*(-1) = -3

第二步,滑动卷积核到下一个位置,再次进行相乘相加操作,得到另一个像素值:

1*(-1) + 1*(-1) + 0*(-1) +
0*(-1) + 0*8 + 1*(-1) +
1*(-1) + 1*(-1) + 0*(-1) = -5

以此类推,重复步骤直到覆盖整个图像。在这个例子中,我们得到了一个2x2的新图像矩阵,其像素值为-3和-5。

所以,经过边缘检测卷积核处理后的结果是:

[-3, -5]
[ 0,  0]

2.代码

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 下载CIFAR10数据集并准备数据加载器
dataset = torchvision.datasets.CIFAR10("./dataset2", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64)

# 定义一个简单的神经网络模型
class Guodong(nn.Module):
    def __init__(self):
        super(Guodong, self).__init__()
        # 定义一个卷积层
        self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)

    def forward(self, x):
        x = self.conv1(x)
        return x

guodong = Guodong()
print(guodong)

# 初始化TensorBoard的SummaryWriter
writer = SummaryWriter("logs")
step = 0

# 遍历数据加载器,处理数据并将结果写入TensorBoard
for data in dataloader:
    imgs, target = data
    print(imgs.shape)  # 打印输入图片的形状
    output = guodong(imgs)  # 将输入图片传入神经网络模型得到输出
    print(output.shape)  # 打印输出的形状
    writer.add_images("input", imgs, step)  # 将输入图片写入TensorBoard
    output = torch.reshape(output, (-1, 3, 30, 30))  # 调整输出的形状以便写入TensorBoard
    writer.add_images("output", output, step)  # 将输出图片写入TensorBoard

    step = step + 1  # 更新步数

程序运行结果:

在这里插入图片描述

打开tensorboard后,结果如下:

在这里插入图片描述

二、池化层 P19

1.池化层简单介绍

池化层详细介绍

池化层(Pooling Layer)是深度学习中常用的一种层,通常用于减少特征图的空间尺寸,降低计算复杂度,并且有助于防止过拟合。池化层在卷积神经网络(CNN)中被广泛应用。

池化层的作用是通过对输入数据进行池化操作来减少特征图的尺寸,从而减少网络参数和计算量。池化操作通常在每个独立的特征图上进行,它使用一个固定大小的窗口在特征图上滑动,并在窗口内部执行一个汇聚运算(如最大池化、平均池化等)来得到一个汇聚后的值作为输出。

常见的池化操作:

最大池化(Max Pooling):在池化窗口内取最大值作为汇聚后的值。
平均池化(Average Pooling):在池化窗口内取平均值作为汇聚后的值。
全局平均池化(Global Average Pooling):对整个特征图进行平均池化,将每个通道的特征图转换为一个标量值。

池化层的主要优点:

减少特征图的维度,降低计算复杂度。
增加平移不变性,提高模型的鲁棒性。
减少过拟合,通过减少特征图维度,可以减少模型参数的数量。

2.代码

(1)池化操作中数字的变化

import torch
from torch import nn
from torch.nn import MaxPool2d

# 创建输入张量
input = torch.tensor([[1, 2, 0, 3, 1],
                    [0, 1, 2, 3, 1],
                    [1, 2, 1, 0, 0],
                    [5, 2, 3, 1, 1],
                    [2, 1, 0, 1, 1]], dtype=torch.float32)

# 将输入张量reshape为(batch_size, channels, height, width)
input = torch.reshape(input, (-1, 1, 5, 5))

# 定义第一个神经网络模型Guodong1,使用MaxPool2d进行最大池化操作,ceil_mode=True
class Guodong1(nn.Module):
    def __init__(self):
        super(Guodong1, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)  # 定义最大池化层,kernel_size为3,启用ceil_mode

    def forward(self, input):
        output = self.maxpool1(input)
        return output

# 创建Guodong1模型实例并进行前向传播
guodong1 = Guodong1()
output1 = guodong1(input)
print("Output of Guodong1 with ceil_mode=True:")
print(output1)

# 定义第二个神经网络模型Guodong2,使用MaxPool2d进行最大池化操作,ceil_mode=False
class Guodong2(nn.Module):
    def __init__(self):
        super(Guodong2, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=False)  # 定义最大池化层,kernel_size为3,不启用ceil_mode

    def forward(self, input):
        output = self.maxpool1(input)
        return output

# 创建Guodong2模型实例并进行前向传播
guodong2 = Guodong2()
output2 = guodong2(input)
print("\nOutput of Guodong2 with ceil_mode=False:")
print(output2)

运行结果:

在这里插入图片描述

(2)池化操作对图片的影响

from torch import nn
import torchvision
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 加载CIFAR10数据集
dataset = torchvision.datasets.CIFAR10("./dataset1", train=False, transform=torchvision.transforms.ToTensor(), download=True)

# 创建数据加载器
dataloader = DataLoader(dataset, batch_size=64)

# 定义神经网络模型Guodong,使用MaxPool2d进行最大池化操作,ceil_mode=True
class Guodong(nn.Module):
    def __init__(self):
        super(Guodong, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)  # 定义最大池化层,kernel_size为3,启用ceil_mode

    def forward(self, input):
        output = self.maxpool1(input)
        return output

guodong = Guodong()

# 创建TensorBoard的SummaryWriter实例
writer = SummaryWriter("./logs_maxpool")
step = 0

# 遍历数据加载器,将输入图像和模型输出图像添加到TensorBoard中
for data in dataloader:
    imgs, target = data
    writer.add_images("input", imgs, step)  # 将输入图像添加到TensorBoard
    output = guodong(imgs)  # 通过模型前向传播得到输出
    writer.add_images("output", output, step)  # 将模型输出的图像添加到TensorBoard
    step = step + 1

writer.close()  # 关闭SummaryWriter

运行结果:

在这里插入图片描述
可以看到,最后的结果就像给图片打了 “马赛克”

三、非线性激活 P20

1.简要介绍

非线性激活函数是神经网络中用于引入非线性特性的函数。在神经网络中,每个神经元除了具有权重和偏置之外,还需要一个激活函数来引入非线性变换,从而使神经网络能够学习复杂的模式和关系。

在深度学习中,使用非线性激活函数的主要原因是为了让神经网络具备学习和表示更加复杂的函数的能力,从而提高模型的表达能力。如果没有非线性激活函数,多层神经网络就会退化为单层网络,无法表达复杂的非线性关系,限制了神经网络的表达能力和学习能力。

常见的非线性激活函数:

ReLU(Rectified Linear Unit):ReLU函数定义为f(x) = max(0, x),即将小于等于0的输入映射为0,大于0的输入保持不变。ReLU函数简单且计算高效,在实际应用中被广泛使用。

Sigmoid函数:Sigmoid函数定义为f(x) = 1 / (1 + exp(-x)),它将输入值映射到一个取值范围在[0, 1]之间的输出。Sigmoid函数常用于二分类问题或者需要将输出限制在一定范围内的任务。

Tanh函数:Tanh函数定义为f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x)),它将输入值映射到一个取值范围在[-1, 1]之间的输出。Tanh函数在某些情况下比Sigmoid函数更适合使用,尤其是在中心化数据和对称性数据上。

Leaky ReLU:Leaky ReLU函数是对ReLU函数的改进,当输入小于0时,引入一个小的斜率来避免神经元“死亡”的问题。Leaky ReLU函数定义为f(x) = max(ax, x),其中a是一个小的正数。

ELU(Exponential Linear Unit):ELU函数在负数区域对输入进行指数级衰减,而在正数区域保持线性增长。ELU函数定义为f(x) = max(ax, x)(x >= 0)和f(x) = a * (exp(x) - 1)(x < 0),其中a是一个小的正数。

Softmax函数:Softmax函数常用于多分类问题中,将一组实数值映射到概率分布上,使得所有输出的总和等于1。Softmax函数定义为f(x_i) = exp(x_i) / sum(exp(x_j))。

2.代码

import torch
import torchvision
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 创建输入张量并reshape为(batch_size, channels, height, width)
input = torch.tensor([[1, 0.5],
                      [-1, 3]])
input = torch.reshape(input, (-1, 1, 2, 2))
print(input.shape)

# 加载CIFAR10数据集
dataset = torchvision.datasets.CIFAR10("./dataset1", train=False, download=True, transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=64)

# 定义神经网络模型Guodong,包含ReLU和Sigmoid激活函数
class Guodong(nn.Module):
    def __init__(self):
        super(Guodong, self).__init__()
        self.relu1 = ReLU()  # 定义ReLU激活函数
        self.sigmoid1 = Sigmoid()  # 定义Sigmoid激活函数

    def forward(self, input):
        output = self.sigmoid1(input)  # 将输入数据经过Sigmoid激活函数得到输出
        return output

guodong = Guodong()
output = guodong(input)
print(output)

# 使用SummaryWriter创建TensorBoard日志
step = 0
writer = SummaryWriter("logs")
for data in dataloader:
    imgs, target = data
    writer.add_images("input", imgs, step)  # 将输入图像添加到TensorBoard
    output = guodong(imgs)  # 通过模型前向传播得到输出
    writer.add_images("output", output, step)  # 将模型输出的图像添加到TensorBoard
    step += 1

writer.close()  # 关闭SummaryWriter

代码运行结果:

在这里插入图片描述

四、线性层及其他层介绍 P21

1.线性层

在这里插入图片描述

2.代码

import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader

# 下载并加载 CIFAR10 数据集
dataset = torchvision.datasets.CIFAR10("./dataset1", train=False, transform=torchvision.transforms.ToTensor(), download=True)

# 创建数据加载器
dataloader = DataLoader(dataset, batch_size=64)

# 定义自定义模型 Guodong
class Guodong(nn.Module):
    def __init__(self):
        super(Guodong, self).__init__()
        self.linear1 = Linear(196608, 10)  # 线性层,将输入维度为 196608 转换为输出维度为 10

    def forward(self, input):
        output = self.linear1(input)
        return output

# 创建 Guodong 模型的实例
guodong = Guodong()

# 遍历数据加载器
for data in dataloader:
    imgs, target = data

    # 打印图像张量的形状
    print(imgs.shape)

    # 将图像展平为一维向量
    output = torch.flatten(imgs)
    print(output.shape)

    # 将展平后的向量输入到 Guodong 模型中进行前向传播
    output = guodong(output)
    print(output.shape)

五、搭建小实战和Sequential的使用 P22

1.要实现的模型

CIFAR10 结构:
在这里插入图片描述

2.代码

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter


class Guodong(nn.Module):
    def __init__(self):
        super(Guodong,self).__init__()
        self.module1 = Sequential(
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self,input):
        output = self.module1(input)
        return output

guodong = Guodong()

input = torch.ones((64, 3, 32, 32))
print(input.shape)
output = guodong(input)
print(output.shape)

writer = SummaryWriter("../seq_logs")
writer.add_graph(guodong, input)

writer.close()

个人运行在tensorboard中显示异常,如下图,目前还不知道具体原因。
如果有大佬知道,可以在评论区指导

pytorch打不开

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

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

相关文章

docker安装和使用kafka

1. 启动zookeeper Kafka依赖zookeeper, 首先安装zookeeper -p&#xff1a;设置映射端口&#xff08;默认2181&#xff09; docker run --name zookeeper \--network app-tier \-e ALLOW_ANONYMOUS_LOGINyes \--restartalways \-d bitnami/zookeeper:latest2. 启动kafka docker…

实验七 综合实验

一&#xff0e; 下载并成功运行Anaconda,jupyter book ,spyder 输入检验(print (“hello”)) 二&#xff0e; 在jupyter prompt中安装库&#xff1a; 找到anaconda 的Scripts库&#xff0c;并复制路径以备后面安装命令 D:\Program Files\anaconda3\Scripts 进入prompt命令…

网络原理初识

一、IP地址 概念 IP 地址主要用于标识网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单说&#xff0c; IP 地址用于定位主机 的网络地址 。 就像我们发送快递一样&#xff0c;需要知道对方的收货地址&#xff0c;快递员才能将包裹送到目的地。 二、…

搭建的svn 1.14.1,拉取代码时候没输入账户密码就报错 auth failed

这边在ubuntu里面搭的svn server&#xff0c;但是拉代码的是否一直报错 auth faield&#xff0c;一开始以为是有auth cache&#xff0c;去设置里面清楚了&#xff0c;windows 里面也清楚了&#xff0c;但是还是报错 问题原因 一直排查才发现&#xff0c;我新增用户的时候&…

vue+uniapp实现图形验证码功能-插件(附源码)

一、需求背景 vueuniapp实现图形验证码功能-插件&#xff08;附源码&#xff09; 在登录系统时&#xff0c;除了密码登录&#xff0c;还需要提供验证码登录。 涉及验证码&#xff0c;为了安全&#xff0c;一般会加入图形验证码&#xff0c;然后再发短信验证码。 如图&#xff1…

为国产信创服务器提供LDAP统一身份认证方案

金融信创作为 8 大行业信创之首&#xff0c;早已成为其他行业信创建设的参考。金融行业有着极为复杂的业务场景&#xff0c;对系统有着极高的稳定可靠需求&#xff0c;因此&#xff0c;在寻找微软 AD 国产化替代方案时&#xff0c;常会涉及到更深层次的场景。例如&#xff0c;最…

计算机大数据毕业设计-基于Flask的旅游推荐可视化系统的设计与实现

基于Flask的旅游推荐可视化系统的设计与实现 编程语言&#xff1a;Python3.10 涉及技术&#xff1a;FlaskMySQL8.0Echarts 开发工具&#xff1a;PyCharm 摘要&#xff1a;以Pycharm为旅游推荐系统开发工具&#xff0c;采用B/S结构&#xff0c;使用Python语言开发旅游景点推…

电网数字孪生的开发框架

电网数字孪生的开发框架通常会综合利用多种技术和工具&#xff0c;包括数据处理、模型建立、仿真与优化等方面的工具和平台。以下是一些常用的开发框架&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。…

网络安全: Kali Linux 进行 SSH 渗透与防御

目录 一、实验 1.环境 2.nmap扫描目标主机 3.Kali Linux 进行 SSH 渗透 3.Kali Linux 进行 SSH 防御 二、问题 1.SSH有哪些安全配置 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本IP备注Kali Linux2022.4 192.168.204.154&#xff08;动态&…

【JavaScript 漫游】【031】window 对象总结

文章简介 本篇文章为【JavaScript 漫游】专栏的第 030 篇文章&#xff0c;记录了浏览器模型中 window 对象的相关知识点。 window 对象概述 浏览器里面&#xff0c;window 对象&#xff08;注意&#xff0c;w 为小写&#xff09;指当前的浏览器窗口。它也是当前页面的顶层对…

Java中线程操作的相关方法

当涉及到在Java中操作线程时&#xff0c;有许多内置的类和方法可供使用。下面是关于Java中线程操作的主要方法和技术的简要教程&#xff1a; 1. 创建线程 在Java中&#xff0c;有两种主要的方式来创建线程&#xff1a; - 继承 Thread 类并重写其 run() 方法。 - 实现 Runna…

深入探讨javascript的流程控制与分支结构,以及js的函数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 1.流程控制与分支结构1.if分支结构2.switch case 分支结构3.循环结…

C++消息队列处理提高性能的方法

1 消息队列特点 在当前多数软件系统中,处理传递消息多用消息队列机制,他具有以下优点: 1. 异步通信:消息队列支持异步通信,发送者和接收者之间的解耦程度较高。发送者将消息放入队列后即可继续执行,而不需要等待接收者的响应。这样可以提高系统的吞吐量和处理能力。 2.…

删除指定的数

删除指定的数 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 先输入10个整数存放在数组中&#xff0c;再输入⼀个整数n&#xff0c;删除数组中所有等于n的数字&#xff0c;数组中剩余的数组保证数组的最前面&#…

电脑键盘快捷键,掌握这些,快速提高效率!

“我是一名电脑新手&#xff0c;在使用电脑时还有很多不懂的。想问问大家平常有什么比较好用的电脑键盘快捷键可以推荐吗&#xff1f;” 在数字化时代&#xff0c;电脑已成为我们生活与工作中不可或缺的工具。掌握一些常用的电脑键盘快捷键&#xff0c;不仅能提高我们的工作效率…

[备赛笔记]——5G大唐杯(5G考试等级考考试基础试题)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

学生信息管理展示-h5版(uniapp+springboot+vue)

记录一下做的第一个完整的h5业务。 一、登录 二、个人中心 三、首页&#xff08;管理员&#xff09; 四、首页&#xff08;学生&#xff09; 五、视频展示 学生信息管理展示&#xff08;h5&#xff09;完整版

如何解决由于浏览器版本升级导致脚本用不了的问题【文章底部可得就业内推码】

目录 1. 使用WebDriverManager&#xff1a; 2. 手动下载更新驱动&#xff1a; 3. 设置浏览器选项&#xff1a; 4. 使用Selenium Grid&#xff1a; 5. 参考官方文档和社区&#xff1a; 面对浏览器版本升级导致的网页自动化脚本无法正常运行的问题&#xff0c;你可以采取以下…

chromedriverUnable to obtain driver for chrome using ,selenium找不到chromedriver

1、下载chromedriver chromedriver下载网址&#xff1a;CNPM Binaries Mirror 老版本在&#xff1a;chromedriver/ 较新版本在&#xff1a;chrome-for-testing/ 2、设置了环境变量还是找不到chromedriverUnable to obtain driver for chrome using NoSuchDriverException:…

Java基础及开发环境配置教程

Java基础 Java是一种广泛使用的编程语言&#xff0c;以其“一次编写&#xff0c;到处运行”的能力而闻名。无论是开发桌面应用程序、Web应用程序还是移动应用程序&#xff0c;Java都是一个优秀的选择。本文将介绍Java的基础知识和如何配置Java开发环境。 1. Java简介 Java是…