【PyTorch 攻略 (3/7)】线性组件、激活函数

2023-09-18 11:11:51

一、说明

        神经网络是由层连接的神经元的集合。每个神经元都是一个小型计算单元,执行简单的计算来共同解决问题。它们按图层组织。有三种类型的层:输入层、隐藏层和输出层。每层包含许多神经元,但输入层除外。神经网络模仿人脑处理信息的方式。

二、神经网络的组件

  • 激活功能确定是否应该激活神经元。神经网络中发生的计算包括应用激活函数。如果一个神经元被激活,那么这意味着输入很重要。有不同种类的激活函数。选择使用哪个激活函数取决于您希望输出的内容。激活函数的另一个重要作用是向模型添加非线性。
    二进制用于将输出节点设置为 1(如果函数结果为正)和 0(如果函数结果为负)。
    Sigmoid 用于预测输出节点介于 0 和 1 之间的概率。
    Tanh 用于预测输出节点是否介于 1 和 -1 之间。用于分类用例。
    ReLU 用于在函数结果为负时将输出节点设置为 0,如果结果为正值,则保留结果值。
  • 权重会影响我们网络的输出接近预期输出值的程度。当输入进入神经元时,它被乘以权重值,结果输出被观察或传递到神经网络中的下一层。层中所有神经元的权重被组织成一个张量。
  • 偏差弥补了激活函数输出与其预期输出之间的差异。低偏差表明网络对输出形式做出更多的假设,而高偏差对输出形式做出的假设较少。

我们可以说,权重为 W 和偏差 b 的神经网络层的输出 y 计算为输入的总和乘以权重加上偏差。
x = ∑(权重∗输入)+ 偏置,其中 f(x) 是激活函数。

三、构建神经网络

        神经网络由对数据执行操作的层/模块组成。torch.nn 命名空间提供了构建自己的神经网络所需的所有构建块。PyTorch 中的每个模块都对 nn 进行子类化。模块。神经网络本身是一个模块,由其他模块(层)组成。这种嵌套结构允许轻松构建和管理复杂的架构。

        在这里,我们将构建一个神经网络来对 FashionMNIST 数据集中的图像进行分类。

%matplotlib inline
import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

四、定义类

        我们通过子类化 nn.Module 来定义神经网络,并在 __init__ 中启动神经网络层。每个 nn.Module 子类都在转发方法中实现对输入数据的操作。

        我们的神经网络由以下内容组成:
- 具有 28x28 或 784 个特征/像素的输入层。
- 第一个线性模块接受输入的 1 个特征并将其转换为具有 784 个特征的隐藏层。
- ReLU 激活函数将应用于转换。
- 第二个线性模块从第一个隐藏层获取 512 个特征作为输入,并将其转换为具有 2 个特征的下一个隐藏层。
- ReLU 激活函数将应用于转换。
- 第 512 个线性模块从第 1 个隐藏层获取 512 个特征作为输入,并将其转换为具有 3(类数)的输出层。
- ReLU 激活函数将应用于转换。

class NeuralNetwork(nn.Module):
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
            nn.ReLU()
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

我们创建一个NeuralNetwork的实例,并将其移动到设备中,并打印其结构。

model = NeuralNetwork().to(device)
print(model)
NeuralNetwork(
  (flatten): Flatten()
  (linear_relu_stack): Sequential(
    (0): Linear(in_features=784, out_features=512, bias=True)
    (1): ReLU()
    (2): Linear(in_features=512, out_features=512, bias=True)
    (3): ReLU()
    (4): Linear(in_features=512, out_features=10, bias=True)
    (5): ReLU()
  )
)

为了使用该模型,我们将输入数据传递给它。这将执行模型的前函数以及一些后台操作。但是,不要直接调用 model.forward()!在输入上调用模型会返回一个 10 维张量,其中包含每个类的原始预测值。我们通过 nn 的实例传递它来获得预测密度。软最大

X = torch.rand(1, 28, 28, device=device)
logits = model(X) 
pred_probab = nn.Softmax(dim=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
Predicted class: tensor([2], device='cuda:0')

让我们分解一下FashionMNIST模型中的层。为了说明它,我们将取一个包含 3 张大小为 28x28 的图像的示例小批量,看看当我们通过网络传递它时会发生什么。

input_image = torch.rand(3,28,28)
print(input_image.size())
torch.Size([3, 28, 28])

4.1 nn.flatten

        我们初始化 nn。拼合图层以将每个 2D 28x28 图像转换为 784 像素值的连续数组(保持小批量尺寸(在 dim=0 时))。每个像素都传递到神经网络的输入层。

flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.size())
torch.Size([3, 784])

4.2 nn.linear

        线性层是一个模块,它使用其存储的权重和偏差对输入应用线性变换。输入层中每个像素的灰度值将连接到隐藏层中的神经元进行变换计算,即权重*输入+偏差

layer1 = nn.Linear(in_features=28*28, out_features=20)
hidden1 = layer1(flat_image)
print(hidden1.size())
torch.Size([3, 20])

4.3 nn.relu

        非线性激活是在模型的输入和输出之间创建复杂映射的原因。它们被应用在线性变换之后引入非线性,帮助神经网络学习各种各样的现象。在这个模型中,我们使用 nn。线性层之间的 ReLU,但还有其他激活会在模型中引入非线性。

        ReLU 激活函数从线性层获取输出,并将负值替换为零。

print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
Before ReLU: tensor([[ 0.2190,  0.1448, -0.5783,  0.1782, -0.4481, -0.2782, -0.5680,  0.1347,
          0.1092, -0.7941, -0.2273, -0.4437,  0.0661,  0.2095,  0.1291, -0.4690,
          0.0358,  0.3173, -0.0259, -0.4028],
        [-0.3531,  0.2385, -0.3172, -0.4717, -0.0382, -0.2066, -0.3859,  0.2607,
          0.3626, -0.4838, -0.2132, -0.7623, -0.2285,  0.2409, -0.2195, -0.4452,
         -0.0609,  0.4035, -0.4889, -0.4500],
        [-0.3651, -0.1240, -0.3222, -0.1072, -0.0112, -0.0397, -0.4105, -0.0233,
         -0.0342, -0.5680, -0.4816, -0.8085, -0.3945, -0.0472,  0.0247, -0.3605,
         -0.0347,  0.1192, -0.2763,  0.1447]], grad_fn=<AddmmBackward>)


After ReLU: tensor([[0.2190, 0.1448, 0.0000, 0.1782, 0.0000, 0.0000, 0.0000, 0.1347, 0.1092,
         0.0000, 0.0000, 0.0000, 0.0661, 0.2095, 0.1291, 0.0000, 0.0358, 0.3173,
         0.0000, 0.0000],
        [0.0000, 0.2385, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2607, 0.3626,
         0.0000, 0.0000, 0.0000, 0.0000, 0.2409, 0.0000, 0.0000, 0.0000, 0.4035,
         0.0000, 0.0000],
        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0247, 0.0000, 0.0000, 0.1192,
         0.0000, 0.1447]], grad_fn=<ReluBackward0>)

4.4 nn.Sequential

        nnSequential是模块的有序容器。数据按照定义的相同顺序传递到所有模块。您可以使用顺序容器将快速网络(如seq_modules)组合在一起。

seq_modules = nn.Sequential(
    flatten,
    layer1,
    nn.ReLU(),
    nn.Linear(20, 10)
)
input_image = torch.rand(3,28,28)
logits = seq_modules(input_image)

4.5 nn.software

        神经网络的最后一个线性层返回对数 — [-infty, infty] 中的
        原始值,这些值被传递给 nn。软最大模块。Softmax 激活函数用于计算神经网络输出的概率。它仅用于神经网络的输出层。结果缩放为表示模型对每个类的预测密度的值 [0,1]。dim 参数指示结果值总和必须为 1 的维度。概率最高的节点预测所需的输出。

softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)

五、模型参数

        神经网络中的许多层都是参数化的,即具有相关的权重和偏差,这些权重和偏差在训练期间进行了优化。子类化 nn.模块会自动跟踪模型对象中定义的所有字段,并使用模型的 parameters() 或 named_parameter() 方法访问所有参数。

print("Model structure: ", model, "\n\n")

for name, param in model.named_parameters():
    print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n")

下一>> PyTorch 简介 (4/7)

更多推荐

python经典百题之判断回文数

题目:一个5位数,判断它是不是回文数即12321是回文数,个位与万位相同,十位与千位相同程序分析回文数是指一个数从左向右和从右向左读是一样的,例如:12321。我们需要编写一个程序来判断一个5位数是否是回文数。方法1:转换成字符串defis_palindrome(num):num_str=str(num)returnn

2023年海南省职业院校技能大赛(高职组)信息安全管理与评估赛项规程

2023年海南省职业院校技能大赛(高职组)信息安全管理与评估赛项规程一、赛项名称赛项名称:信息安全管理与评估英文名称:InformationSecurityManagementandEvaluation赛项组别:高等职业教育赛项归属产业:电子与信息大类二、竞赛目标为全面贯彻落实国家网络强国战略,对接新一代信息技术产业,

java中mysql事务嵌套回滚

在Java开发中,MySQL事务嵌套回滚时经常会遇到。本文将介绍如何在Java中处理MySQL事务嵌套回滚的问题。在开始之前,我们需要先了解什么是事务嵌套回滚。当在一个事务中嵌套了其他事务并且其中一个事务回滚时,该事务及其所有嵌套的事务都会被回滚。这可以保持数据的一致性。但是,重要的是,要正确处理异常和回滚。下面是Ja

良好的测试环境应该怎么搭建?对软件产品起到什么作用?

为了确保软件产品的高质量,搭建一个良好的测试环境是至关重要的。在本文中,我们将从多个角度出发,详细描述良好的测试环境的搭建方法、注意事项以及对软件产品的作用。一、软件测试环境的搭建1、从硬件设备的选择与配置开始。对于大型软件产品的测试,建议使用高性能的服务器以及分布式测试平台。在选择服务器时,要考虑产品的特性、测试需求

【结构型】享元模式(Flyweight)

目录享元模式(Flyweight)适用场景享元模式实例代码(Java)享元模式(Flyweight)运用共享技术有效地支持大量细粒度的对象。(业务模型的对象进行细分得到科学合理的更多对象)适用场景一个应用程序使用了大量的对象。完全由于使用大量的对象,造成很大的存储开销。对象的大多数状态都可变为外部状态。如果删除对象的外

【2023集创赛】加速科技杯作品:高光响应的二硫化铼光电探测器

本文为2023年第七届全国大学生集成电路创新创业大赛(“集创赛”)加速科技杯西北赛区二等奖作品分享,参加极术社区的【有奖征集】分享你的2023集创赛作品,秀出作品风采,分享2023集创赛作品扩大影响力,更有丰富电子礼品等你来领!团队介绍参赛单位:西北工业大学队伍名称:噜啦噜啦咧指导老师:李伟参赛队员:程琳,韩笑,尹天乐

苹果手机怎么录屏?1分钟轻松搞定

虽然一直使用苹果手机,但是对它的录屏功能还不是很会使用。苹果手机怎么录屏?录屏可以录制声音吗?麻烦大家教教我!苹果手机为用户提供了十分便捷的内置录屏功能,可以让您随时随地录制手机上的内容。但是很多小伙伴在第一次使用苹果手机时,找不到苹果手机的录屏工具在哪,所以不知道该如何进行录屏。那么,苹果手机怎么录屏呢?下面将给大家

python+nodejs+php+springboot+vue 学生选课程作业提交教学辅助管理系统

二、项目设计目标与原则1、关于课程作业管理系统的基本要求(1)功能要求:可以管理首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理、作业提交管理、作业评分管理、课程评价管理、课程资源管理等功能模块。(2)性能:在不同操作系统上均能无差错实现在不同类型的用户

[答疑]角色和状态的区别

DDD领域驱动设计批评文集“软件方法建模师”不再考查基础题《软件方法》各章合集jeri2023-9-1013:09设备关联角色,设备也有子类(车辆/设备),按书中的解释,设备是一个抽象类,角色类名像是带了状态名的类,如在使用的设备/在维护的设备,设备和这几个角色是关联关系,而且是0.1的关系,潘老师的观点是泛化关系还是

Linux下的网络编程——网络基础、socket编程(一)

前言:前面我们学习了Linux的系统编程,从今天我们就要开始Linux网络编程的学习了,Linux网络编程中的知识点可能没有前面的Linux系统多一点,但是基础的网络知识我们还是需要了解的,并且网络编程中的socket编程的知识也是相当重要的,那么现在我们就开始Linux网络编程的学习吧。目录一、协议1.7层模型和4层

使用Oracle实现完美的不重复随机数(oracle不重复随机数

使用Oracle实现完美的不重复随机数Oracle是一个功能强大的关系型数据库管理系统,它可以实现各种数据库操作和管理。在许多应用程序中,生成随机数是一个非常常见的任务。然而,许多时候,我们需要生成不重复的随机数,以确保数据的完整性和准确性。下面我们将介绍如何使用Oracle实现完美的不重复随机数。生成不重复随机数的方

热文推荐