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

一、说明

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

二、神经网络的组件

  • 激活功能确定是否应该激活神经元。神经网络中发生的计算包括应用激活函数。如果一个神经元被激活,那么这意味着输入很重要。有不同种类的激活函数。选择使用哪个激活函数取决于您希望输出的内容。激活函数的另一个重要作用是向模型添加非线性。
    二进制用于将输出节点设置为 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)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis环境配置

【Redis解压即可】链接&#xff1a;https://pan.baidu.com/s/1y4xVLF8-8PI8qrczbxde9w?pwd0122 提取码&#xff1a;0122 【Redis桌面工具】 链接&#xff1a;https://pan.baidu.com/s/1IlsUy9sMfh95dQPeeM_1Qg?pwd0122 提取码&#xff1a;0122 Redis安装步骤 1.先打开Redis…

企业架构LNMP学习笔记51

企业案例使用&#xff1a; 主从模式&#xff1a; 缓存集群结构示意图&#xff1a; 去实现Redis的业务分离&#xff1a; 读的请求分配到从服务器上&#xff0c;写的请求分配到主服务器上。 Redis是没有中间件来进行分离的。 是通过业务代码直接来进行读写分离。 准备两台虚…

Vue中如何进行表格排序与过滤

Vue中如何进行表格排序与过滤 在Vue.js中&#xff0c;表格是一个常见的数据展示方式。很多时候&#xff0c;我们需要对表格中的数据进行排序和过滤&#xff0c;以提供更好的用户体验。本文将介绍如何在Vue中实现表格的排序和过滤功能&#xff0c;并提供相关的代码示例。 准备工…

Scapy 解析 pcap 文件从HTTP流量中提取图片

Scapy 解析 pcap 文件从HTTP流量中提取图片 前言一、网络环境示例二、嗅探流量示例三、pcap 文件处理最后参考 ​ 作者&#xff1a;高玉涵 ​ 时间&#xff1a;2023.9.17 10:25 ​ 环境&#xff1a;Linux kali 5.15.0-kali3-amd64&#xff0c;Python 3.11.4&#xff0c;scapy…

Unity Shader顶点数据疑问

1&#xff09;Unity Shader顶点数据疑问 2&#xff09;Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 3&#xff09;安卓游戏启动后提示“应用程序异常” 这是第352篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖子等技术知…

Spring WebFlux使用未加前缀的双通配符模式绕过安全性CVE-2023-34034

文章目录 0.前言漏洞漏洞介绍描述 1.参考文档2.基础介绍3.解决方案3.1. 升级版本 4.漏洞修复源码分析5. 漏洞利用示例 0.前言 背景&#xff1a;公司项目扫描到 WebFlux中使用"**"作为模式会导致Spring Security和Spring WebFlux之间 CVE-2023-34034漏洞 漏洞 高 | 2…

windows彻底卸载unity

1.控制面板卸载 双击打开桌面的控制面板&#xff0c;选择卸载程序&#xff0c;选中Unity和UnityHub右击卸载。 2.清除unity的注册表 在运行中输入“regedit”双击打开注册表界面 删除 HKEY_CURRENT_USER\Software\Unity 下所有项 删除 HKEY_CURRENT_USER\Software\Unity Tec…

23下半年学习计划

大二上学期计划 现在已经是大二了&#xff0c;java只学了些皮毛&#xff0c;要学的知识还有很多&#xff0c;新的学期要找准方向&#xff0c;把要学的知识罗列&#xff0c;按部就班地完成计划&#xff0c;合理安排时间&#xff0c;按时完成学习任务。 学习node.js&#xff0c…

利用C++开发一个迷你的英文单词录入和测试小程序

主要是利用最近学的一些C 11新特性&#xff0c;完全虚构一个小程序来练练手&#xff0c;其实也不是完全虚构也有一点点用处。 主要参考的书&#xff1a; 深入应用C11 -- 代码优化与工程实践 先描述需求 1. 可以录入英文单词和翻译的内容 2. 可以等录入的多了&#xff0c;挑…

负载均衡原理及应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

李宏毅hw-6利用GAN生成动漫图像

一、查漏补缺、熟能生巧&#xff1a; 1.什么是转置卷积convTranspose、以及这种转置卷积怎么使用&#xff1a; &#xff08;1&#xff09;具体的原理直接看李沐老师的那个演示&#xff0c;非常清晰&#xff1a; 47 转置卷积【动手学深度学习v2】_哔哩哔哩_bilibili &#x…

《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存

《数字图像处理-OpenCV/Python》连载&#xff08;7&#xff09;视频文件的读取与保存 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为…