简单易懂的PyTorch线性层解析:神经网络的构建基石

news2024/11/13 15:59:48

目录

torch.nn子模块Linear Layers详解

nn.Identity

Identity 类描述

Identity 类的功能和作用

Identity 类的参数

形状

示例代码

nn.Linear

Linear 类描述

Linear 类的功能和作用

Linear 类的参数

形状

变量

示例代码

nn.Bilinear

Bilinear 类的功能和作用

Bilinear 类的参数

形状

变量

 示例代码

nn.LazyLinear

LazyLinear 类描述

LazyLinear 类的功能和作用

LazyLinear 类的参数

变量

cls_to_become

示例代码

总结


torch.nn子模块Linear Layers详解

nn.Identity

Identity 类描述

torch.nn.Identity 类在 PyTorch 中提供了一个占位的恒等操作符,该操作符对传入的参数不敏感。它基本上是一个通过层,不对数据进行任何改变。

Identity 类的功能和作用
  • 数据传递: 在网络中,Identity 类用作一个占位符,允许数据无修改地通过。
  • 结构保持: 在修改或调试网络结构时,可以临时替换其他层,而不改变输入和输出的形状。
  • 参数灵活性: 该类可以接受任意参数 (*args, **kwargs),但这些参数不会被使用。
Identity 类的参数
  • args (Any): 任何参数(未使用)。
  • kwargs (Any): 任何关键字参数(未使用)。
形状
  • 输入: (∗),其中 表示任意数量的维度。
  • 输出: (∗),与输入形状相同。
示例代码
import torch
import torch.nn as nn

# 创建 Identity 实例
m = nn.Identity()

# 输入数据
input = torch.randn(128, 20)

# 通过 Identity 层
output = m(input)

# 输出形状
print(output.size())  # torch.Size([128, 20])

在这个例子中,Identity 层被用作一个简单的传递层,输入和输出形状完全相同。torch.nn.Identity 类是一个非常简单但有时非常有用的工具,特别是在需要保持网络结构但又不想改变数据流的情况下。它的存在使得网络架构的调整变得更加灵活和方便。

nn.Linear

Linear 类描述

torch.nn.Linear 类在 PyTorch 中实现了一个全连接层,也被称为线性层或密集层。它对输入数据应用一个线性变换。

Linear 类的功能和作用
  • 线性变换: 对输入数据应用线性变换y=xA^{T}+b 。
  • 适用于多种网络架构: 作为神经网络中最基本的组件之一,用于构建各种复杂网络结构。
Linear 类的参数
  1. in_features (int): 每个输入样本的大小。
  2. out_features (int): 每个输出样本的大小。
  3. bias (bool): 如果设置为 False,则层不会学习附加的偏置。默认值:True。
形状
  • 输入: (∗, H_in),其中 表示任意数量的额外维度,H_inin_features
  • 输出: (∗, H_out),除最后一维外,其他维度与输入相同,H_outout_features
变量
  • weight (torch.Tensor): 形状为 (out_features, in_features) 的可学习权重。值从均匀分布 U(-k, k) 初始化,其中 k=\frac{1}{\sqrt{in\_features}} 用于初始化神经网络中 Linear (全连接) 层的权重。这里的 k 是一个根据输入特征数 (in_features) 计算出的值,用于确定权重初始化时均匀分布的范围。在这个公式中:

        in_featuresin_features 指的是输入层的特征数量。

        k 的值是 in_featuresin_features 的平方根的倒数。

  • bias (torch.Tensor): 形状为 (out_features) 的可学习偏置。如果 bias 为 True,则值从相同的均匀分布初始化。
示例代码
import torch
import torch.nn as nn

# 创建 Linear 实例
m = nn.Linear(20, 30)

# 输入数据
input = torch.randn(128, 20)

# 前向传播
output = m(input)

# 输出形状
print(output.size())  # torch.Size([128, 30])

这段代码展示了如何创建并使用 Linear 层。在这个例子中,输入数据的形状是 (128, 20)Linear 层将其转换为形状 (128, 30) 的输出。 

nn.Bilinear

torch.nn.Bilinear 类在 PyTorch 中实现了一个双线性变换层。这个层对两个不同的输入执行双线性变换,这种变换涉及到两个输入的元素乘积。

Bilinear 类的功能和作用
  • 双线性变换: 对两个输入数据 x_{1} 和 x_{2} 应用双线性变换 y=x_{1}^{T}Ax_{2}+b 。
  •  应用场景: 在某些场景下,双线性变换能够有效地建模两个不同输入之间的复杂关系,如在推荐系统、关系建模等领域。

Bilinear 类的参数
  1. in1_features (int): 第一个输入样本的特征大小。
  2. in2_features (int): 第二个输入样本的特征大小。
  3. out_features (int): 输出样本的特征大小。
  4. bias (bool): 如果设置为 False,则层不会学习附加偏置。默认值:True。
形状
  • 输入1: (∗, H_{in1}),其中 H_{in1} = in1_features 表示任意数量的额外维度。
  • 输入2: (∗, H_{in2}),其中 H_{in2} = in2_features
  • 输出: (∗, H_{out}),其中 H_{out} = out_features,除最后一维外,其他维度与输入形状相同。
变量
  • weight (torch.Tensor): 形状为 (out_features, in1_features, in2_features) 的可学习权重。值从均匀分布U(-k, k) 初始化,其中 k=\frac{1}{\sqrt{in\_features}} 。
  • bias (torch.Tensor): 形状为 (out_features) 的可学习偏置。如果 bias 为 True,则值从相同的均匀分布初始化。
 示例代码
import torch
import torch.nn as nn

# 创建 Bilinear 实例
m = nn.Bilinear(20, 30, 40)

# 输入数据
input1 = torch.randn(128, 20)
input2 = torch.randn(128, 30)

# 前向传播
output = m(input1, input2)

# 输出形状
print(output.size())  # torch.Size([128, 40])

这段代码展示了如何创建并使用 Bilinear 层。在这个例子中,有两个不同形状的输入数据,Bilinear 层根据这两个输入生成形状为 (128, 40) 的输出。

torch.nn.Bilinear 类是一种特殊的神经网络层,它通过将两个输入数据的特征结合起来,提供了一种模拟复杂关系的有效方式。这种层在需要考虑两组不同特征之间交互的情况下特别有用。

nn.LazyLinear

LazyLinear 类描述

torch.nn.LazyLinear 类在 PyTorch 中提供了一种“懒加载”版本的线性层(Linear)。在这个模块中,in_features(输入特征的数量)是从第一次执行前向传播时输入数据的形状推断出来的。

LazyLinear 类的功能和作用
  • 自动推断 in_features: 这个类允许用户在初始化时不指定输入特征的大小(in_features),该值会在模块第一次前向传播时自动推断。
  • 延迟初始化: 权重和偏置参数在第一次前向传播时才被初始化,之前它们是未初始化的。
  • 转换为常规 Linear 层: 一旦完成第一次前向传播,LazyLinear 模块就会变成常规的 torch.nn.Linear 模块。
LazyLinear 类的参数
  • out_features (int): 每个输出样本的大小。
  • bias (UninitializedParameter): 如果设置为 False,则层不会学习附加偏置。默认值:True。
变量
  • weight (torch.nn.parameter.UninitializedParameter): 形状为 (out_features, in_features) 的可学习权重。在第一次前向传播后,值将从均匀分布初始化。
  • bias (torch.nn.parameter.UninitializedParameter): 形状为 (out_features) 的可学习偏置。如果 bias 为 True,则值也将在第一次前向传播后从均匀分布初始化。
cls_to_become
  • 别名:Linear
示例代码
import torch
import torch.nn as nn

# 创建 LazyLinear 实例
lazy_linear = nn.LazyLinear(out_features=30)

# 输入数据
input = torch.randn(128, 20)  # 注意,这里没有指定 in_features

# 前向传播
output = lazy_linear(input)

# 输出形状
print(output.size())  # torch.Size([128, 30])

这段代码展示了如何创建并使用 LazyLinear 层。在这个例子中,初始时并不需要指定输入特征的大小,它会在第一次调用 forward 方法时自动确定。torch.nn.LazyLinear 类是一种方便的工具,特别适合于在模型设计阶段不确定输入大小的场景。它简化了模型初始化过程,允许更灵活的设计,并在确定实际输入大小后自动完成参数初始化。

总结

 本篇博客探索了 PyTorch 中 torch.nn 子模块中的几种关键线性层,包括 Identity, Linear, Bilinear, 和 LazyLinear。每个类别都被详细解析,强调了它们在神经网络中的独特角色和应用场景。从基础的 Linear 层,负责标准的线性变换,到更复杂的 Bilinear 层,用于建模两组输入特征间的交互关系,再到灵活而方便的 LazyLinear 层,自动推断输入特征大小,每种层都提供了不同的机制来处理和学习数据。

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

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

相关文章

Open CV 图像处理基础:(一)Open CV 在windows环境初始化和 Java 动态库加载方式介绍

Open CV 在windows环境初始化和 Java 动态库加载方式介绍 Open CV是一个开源的计算机视觉和机器学习软件库,它提供了一系列的工具和程序库,让用户能够进行复杂的图像处理和计算机视觉任务。在Java中使用OpenCV涉及到环境初始化和动态库加载。以下是一些…

什么是消费增值?如何做到增值?

在当今的商业世界,消费观念正在经历一场深刻的变革。传统的消费模式中,消费者购买商品后,交易即结束,消费者与商品的关系仅停留在使用层面。然而,随着消费增值模式的出现,这一观念正在被颠覆。这一模式将消…

蓝牙网关在物联网领域三大应用

蓝牙网关在物联网的应用主要包括物联网室内定位、物联网数据采集、物联网连接控制三大应用领域,以下对三大应用领域做详细解释。 一、物联网蓝牙室内定位 蓝牙网关在室内定位的应用包括人员定位和资产设备定位两大方向。 1、人员定位 蓝牙网关安装于室内的特定地…

Fragstats景观格局指数计算入门教程

土地利用以及景观格局是当前全球环境变化研究的重要组成部分及核心内容,其对区域的可持续发展以及区域土地管理有非常重要的意义。通过对土地利用时空变化规律进行分析可以更好的了解土地利用变化的过程和机制,并且通过调整人类社会经济活动,…

【AI视野·今日NLP 自然语言处理论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 5 Jan 2024 Totally 28 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers LLaMA Pro: Progressive LLaMA with Block Expansion Authors Chengyue Wu, Yukang Gan, Yixiao Ge, Zeyu Lu, …

安科瑞智慧型动态无功补偿的工业应用——安科瑞赵嘉敏

摘要:低压配电系统的无功补偿是电能质量治理的重要环节。在传统无功补偿中,响应速度较慢,补偿电流呈阶梯式,存在过补或欠补的现象,有时未必能到达理想的效果。为了解决这一问题,人们提出了一种无功补偿综合…

明基、书客、松下护眼台灯怎么样?三款热门台灯真实测评

近年来学生近视的现象越来越严重了,而且近视的年龄也越来越小了,不少还没开始上小学的孩子,就已经戴上了厚厚的近视眼镜。而那些高年级的学生更是近视的重灾区,不仅需要高强度的学习和长时间用眼,而且每晚都需要学习到…

cuttag和chip-seq的区别?

Cut&Tag(Cleavage Under Targets and Tagmentation)和ChIP-Seq(Chromatin Immunoprecipitation Sequencing)都是用于研究蛋白质与DNA相互作用的生物技术。它们在技术原理和应用方面有一些关键的区别。 1.ChIP-Seq测序 1.1 …

Linux 部署 AI 换脸

我使用的系统是 Ubuntu 20.04 文章实操主要分为以下几个部分 1、python 环境安装 2、下载 FaceFusion 上传服务器 3、创建 python 虚拟环境 4、下载 FaceFusion 依赖(这里的命令执行时间会很长,够你睡午觉了) 5、运行 FaceFusion 6、开…

基于SSM的基金投资交易管理网站的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Java学习笔记(五)——时间相关类

文章目录 JDK7以前时间相关类Date 时间类阅读源码练习 SimpleDateFormat 格式化时间作用构造方法常用方法日期和时间模式练习 Calendar 日历获取Calendar对象的方法Calendar常用方法 JDK8新增时间相关类变化Date类ZoneId:时区Instant:时间戳ZoneDateTime…

ECharts 实现省份在对应地图的中心位置

使用 ECharts 下载的中国省市区的json文件不是居中的(如下图所示),此时需要修改json文件中的 cp 地理位置,设置成每个省份的中心位置 {"type": "FeatureCollection","features":[{ "type": "Feature"…

C++ 手写堆 || 堆模版题:堆排序

输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。 输入格式 第一行包含整数 n 和 m 。 第二行包含 n 个整数,表示整数数列。 输出格式 共一行,包含 m 个整数,表示整数数列中前 m 小的数。 数据范围 1≤m≤n≤105 &…

护眼灯色温多少合适?盘点合适色温的护眼台灯

有了孩子,就等于同时有了软肋和铠甲,也总是在自己的能力范围内,把最好的东西给他。当孩子开始学习知识后更是如此,能力范围内最好的教育资源、最好的学习环境,以及各种与之配套的学习用具。护眼台灯在这时候就安排上了…

热钱涌向线控底盘!XYZ全栈集成引领新风向

在车身、底盘部分,中央计算区域控制带动传统车控、底盘及动力控制ECU市场迎来新一轮技术升级和域融合窗口期。线控制动、转向及空气悬架,正在加速与智能驾驶融合并进一步提升驾乘体验。 12月13-15日,2023(第七届)高工…

插画新手必看!13个免费UI插画素材网站,轻松打造炫酷设计!

即时设计 作为一个专业的设计网站,即时设计在很多情况下也可以作为一个高质量的插图网站使用。它可以为用户提供近5万个设计材料和模板,其中插图占据了很大的空间,可以为用户的设计提供很多帮助。在搜索插图材料的同时,还可以获取…

强化学习7——价值迭代算法在强化学习中的应用

价值迭代算法 价值迭代算法相对于策略迭代更加直接,它直接根据以下公式来迭代更新。 V ∗ ( s ) max ⁡ a ∈ A { r ( s , a ) γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V ∗ ( s ′ ) } V^*(s)\max_{a\in\mathcal{A}}\{r(s,a)\gamma\sum_{s\in\mathcal{S}}P(s|s,…

二叉树的深度和高度问题(算法村第八关白银挑战)

二叉树的最大深度 104. 二叉树的最大深度 - 力扣(LeetCode) 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null…

爱奇艺的cmd5x签名校验算法及视频下载

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ js分析,分析爱奇艺的cmd5x校验值。” 最近来了个从web网页自动下载爱奇艺的视频内容的需求,本以为很简单,却发现里面还是有些门道的,需要解决里面的校验的问题,特记录。…

Unity C# 枚举多选

枚举多选 &#x1f96a;例子&#x1f354;判断 &#x1f96a;例子 [System.Flags]public enum TestEnum{ None 0,Rooms 1 << 1,Walls1<<2,Objects1<<3,Slabs 1 << 4,All Rooms|Walls|Objects|Slabs}&#x1f354;判断 TestEnum test TestEnum.R…