【Torch】nn.Linear算法详解

1. 定义

nn.Linear 是 PyTorch 中最基础的全连接(fully‐connected)线性层,也称仿射变换层(affine layer)。它对输入张量做一次线性变换:
output = x W T + b \text{output} = x W^{T} + b output=xWT+b
其中, W W W是形状为 ( out_features , in_features ) (\text{out\_features}, \text{in\_features}) (out_features,in_features)的权重矩阵, b b b是长度为 out_features \text{out\_features} out_features的偏置向量。

2. 输入与输出

  • 输入(Input)

    • 类型:浮点型张量(如 torch.float32,也可与权重同 dtype)
    • 形状 ( … , i n _ f e a t u r e s ) (\dots, \mathrm{in\_features}) (,in_features),最后一维必须与 in_features 匹配;前面的 可以是 batch 大小或任意额外维度。
  • 输出(Output)

    • 类型:浮点型张量
    • 形状 ( … , o u t _ f e a t u r e s ) (\dots, \mathrm{out\_features}) (,out_features),即将最后一维从 in_features 变换为 out_features,前面的维度保持不变。

3. 底层原理

  1. 矩阵乘法
    对输入张量的最后一维做矩阵乘法:
    y [ . . . , j ] = ∑ i = 1 i n _ f e a t u r e s x [ . . . , i ] × W j , i ( ∀ j = 1 … o u t _ f e a t u r e s ) y[..., j] = \sum_{i=1}^{\mathrm{in\_features}} x[..., i] \times W_{j,i} \quad (\forall\,j=1\ldots\mathrm{out\_features}) y[...,j]=i=1in_featuresx[...,i]×Wj,i(j=1out_features)
  2. 加偏置
    bias=True,则在乘积结果上逐元素加偏置 b j b_j bj
    y [ . . . , j ] = ( x W T ) [ . . . , j ] + b j y[..., j] \;=\; (x W^T)[..., j] \;+\; b_j y[...,j]=(xWT)[...,j]+bj
  3. 梯度更新
    • 权重 W W W:梯度 ∂ L ∂ W j , i = ∑ x [ . . . , i ] × δ y [ . . . , j ] \frac{\partial \mathcal{L}}{\partial W_{j,i}} = \sum x[..., i]\times \delta y[..., j] Wj,iL=x[...,i]×δy[...,j]
    • 偏置 b b b:梯度 ∑ δ y [ . . . , j ] \sum \delta y[..., j] δy[...,j]
      优化器(如 SGD、Adam 等)根据梯度更新参数。

4. 构造函数参数详解

参数类型 & 默认说明
in_featuresint必填。输入特征维度,即每个样本最后一维的大小。
out_featuresint必填。输出特征维度,即映射后的最后一维大小(神经元个数)。
biasbool,默认 True是否使用偏置向量 b。若为 False,则不加偏置。
devicetorch.deviceNone指定权重和偏置所在设备(CPU/GPU);若为 None,默认继承父模块设备。
dtypetorch.dtypeNone指定权重和偏置的数据类型;若为 None,默认继承父模块 dtype。

权重与偏置初始化

  • 默认情况下,W 按均匀分布初始化:
    W j , i ∼ U ( − 1 i n _ f e a t u r e s , 1 i n _ f e a t u r e s ) W_{j,i}\sim \mathcal{U}\Bigl(-\sqrt{\tfrac{1}{\mathrm{in\_features}}},\;\sqrt{\tfrac{1}{\mathrm{in\_features}}}\Bigr) Wj,iU(in_features1 ,in_features1 )
  • 偏置 b b b初始化为全零。

5. 使用示例

import torch
import torch.nn as nn# 1. 定义线性层
in_dim  = 64   # 输入维度
out_dim = 10   # 输出维度(例如分类 10 类的 logits)
linear = nn.Linear(in_features=in_dim,out_features=out_dim,bias=True
)# 2. 构造输入
# 假设 batch_size=8
x = torch.randn(8, in_dim)  # shape=[8,64]# 3. 前向计算
# 输出 shape=[8,10]
y = linear(x)
print(y.shape)  # torch.Size([8, 10])

如果不希望使用偏置:

linear_no_bias = nn.Linear(in_dim, out_dim, bias=False)

在更高维场景下也可:

# 输入 shape=[batch, seq_len, in_dim]
x_seq = torch.randn(8, 5, in_dim)
# 输出 shape=[8, 5, out_dim]
y_seq = linear(x_seq)

6. 注意事项

  1. 维度匹配
    • 确保输入最后一维等于 in_features,否则会报维度不匹配错误。
  2. 批量处理
    • 对多维输入,nn.Linear 自动应用到最后一维,无需手动 reshape(除非想将多个维度合并后统一处理)。
  3. 初始化
    • 默认初始化适用于常见场景;若训练不稳定,可手动调用 nn.init 系列方法(如 kaiming_uniform_, xavier_normal_ 等)重新初始化。
  4. 无偏置场景
    • 对于某些网络结构(如批归一化紧跟线性层),可关闭 bias 减少参数不用多余偏置。
  5. 设备与 dtype
    • 在多 GPU 或混合精度训练时,可通过 devicedtype 参数显式控制,避免后续 .to() 调用。
  6. 与 Conv1d 的联系
    • 本质上,nn.Conv1d(in_dim, out_dim, kernel_size=1) 相当于在时间维度(或序列维度)上对每个位置做一个 nn.Linear;理解这一点有助于模型设计。

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

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

相关文章

ZGC收集器

ZGC收集器 欢迎来到我的博客:TWind的博客 我的CSDN::Thanwind-CSDN博客 我的掘金:Thanwinde 的个人主页 0.前言 ZGC收集器完全可以说是Java收集器的一个跨时代的收集器,他真正意义上实现了停顿时间在10ms以内并且几乎全时段都是…

隧道技术篇2frp代理nps代理shisel代理

FRP代理 1.实现湖北内网控制北京的内网C2上线 2.实现湖北内网探针北京内网 信息收集 (socks建立和端口映射) 1.连接47.98.210.85 7000端口服务端 2.尝试将服务端的6666转到127.0.0.1 5555采用tcp协议,备注名proxies serverAddr"47.98…

[Python 基础课程]PyCharm 的安装

Python 的编辑器目前主流的有 PyCharm 和 Vscode。 PyCharm 是 Python 目前最主流、最常用、最推荐的 Python 编辑器。 https://www.jetbrains.com/pycharm/ PyCharm 有社区版和专业版,可以根据自己的需要下载对应的版本。社区版是收费的,对于初学者或…

Spread Ribbon 工具栏控件:在WinForms中高效编辑Spread工作簿

引言 在数据密集型应用中,电子表格功能是提升用户体验的关键要素。GrapeCity Spread.NET V17 推出的独立 Ribbon工具栏控件,为WinForms开发者提供了与Excel高度一致的UI交互体验。通过集成此控件,用户可直观地进行数据编辑、格式调整等操作&…

leedcode:找到字符串中所有字母异位词

问题:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 package com.text;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;…

华为云Flexus+DeepSeek征文|基于华为云 Flexus Dify平台开发AI Agent的详细流程

目录 一、Dify 应用开发平台 1.1 什么是 Dify? 1.2 Dify 平台优势 二、构建 AI Agent 2.1 创建智能客服助手 2.2 配置 LLM组件 三、访问智能应用 3.1 应用发布 3.2 智能对话 四、API 调用智能客服助手 4.1 配置 API 访问接口 4.2 调用智能客服助手API …

【知识图谱构建系列7】:结果评价(1)

文章目录 前言前情提要三元组提取结果评价脚本代码分析几分钟后前言 翻了一下记录,发现咱的知识图谱构建已经接近10天没有搞了。时间也是过得真快啊。但这毕竟是咱未来产生论文的主要阵地,所以得赶紧把节奏给拾起来哈~ 前情提要 我们已经可以在mistral模型的基础上,跑通提…

BT下载工具 qBittorrent v5.1.1.10,便携无广告,BT下载速度翻倍

[软件名称]: BT下载工具 qBittorrent v5.1.1.10 [软件大小]: 15.9 MB [下载通道]: 夸克盘 | 迅雷盘 软件介绍 🔥《qBittorrent增强版》v5.1.1.10便携版|BT下载神器,速度与隐私兼得🌐 ✨ 核心优势: ✅ 无视版权限制…

裂变与重构:2025年大模型生态全景透视及未来趋势研判

1. 2025上半年:大模型生态的裂变时刻 1.1 技术范式革命:从生成到推理的跨越 2025年1月DeepSeek的横空出世,标志着大模型正式进入"推理时代"。这款国产模型在发布首周即突破1亿用户量级,其核心突破在于将传统生成能力升…

【docker】如何正确拉取langgraph-api

加这些配置都没用 # 设置代理环境变量 export HTTP_PROXY=http://127.0.0.1:7890 export HTTPS_PROXY=http://127.0.0.1:7890 # 设置更长的超时时间 export DOCKER_CLIENT_TIMEOUT=

PIXHAWK(ardupilot4.52)上传航点的bug

起因是查看飞控日志时发现地面站上传的平行航线,在日志看到航线却并不是平行的。 然后对比了一下地面站上传的航点信息跟飞控读取到的航点信息 发现经纬度只有前几位能够对应上,后几位都对应不上,两个点之间相差了50公分。地面站工程师认为地…

车载ECU刷写文件格式汇总详解

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从&#x…

Redis核心知识详解:从全局命令到高级数据结构

一、Redis全局命令详解 1.1 键查看与管理 dbsize:高效获取键总数(O(1)操作) 127.0.0.1:6379> dbsize (integer) 8 keys:生产环境避免使用(O(n)操作) # 查找user开头的键(不推荐生产使用…

【网络】Linux 内核优化实战 - net.ipv4.tcp_mem

目录 参数结构与含义与缓冲区大小参数的区别内存管理机制详解1. 内存使用状态与触发逻辑2. 与其他参数的协同关系 典型调整场景与配置示例场景 1:高并发低带宽服务(如 API 网关,数万连接但单连接流量小)场景 2:高带宽低…

插入排序的简单介绍

今天给大家简单介绍一下插入排序。 插入排序,其基本思想是将未排序的数据逐步插入到已排序序列中的合适位置,从而使整个序列逐渐有序。 下面我们看一个排序的过程(升序),给定一个int类型的数组,利用插入排…

docker搭建minio和python使用minio

1 准备工作 1.创建目录 [rootk8s-storage tmp]# mkdir -pv minio/{data,conf} mkdir: created directory ‘minio’ mkdir: created directory ‘minio/data’ mkdir: created directory ‘minio/conf’[rootk8s-storage minio]# chmod 777 -R *2.生成https证书 openssl req…

开源代码修复新标杆——月之暗面最新开源编程模型Kimi-Dev-72B本地部署教程,自博弈修复 Bug

一、介绍 Kimi-Dev-72B是由月之暗面(Moonshot AI)最新开源的AI编程模型,专为软件工程任务设计,并登顶 SWE-bench Verified 基准测试榜首,超越 DeepSeek-R1 等模型,成为当前开源代码模型的 SOTA&#xff1a…

微服务架构之基本设计原则

作为系统架构师,在进行架构设计时需要遵循一系列经过实践验证的核心原则,这些原则贯穿于需求分析、模块划分、技术选型和系统演进的全流程。以下从核心设计原则、架构特性原则、工程实践原则三个维度,结合具体案例展开说明: 一、…

Wpf布局之WrapPanel面板!

文章目录 前言一、引言二、使用步骤 前言 Wpf布局之WrapPanel面板! 一、引言 WrapPanel面板以一次一行或一列的方式布置控件! 二、使用步骤 WrapPanel面板Orientation属性默认是"Horizontal",将控件从左向右进行排列&#xff…

QEMU运行RISCV版Ubuntu

宿主机为ubuntu20.04,推荐ubuntu 20.04 risc-v版, 宿主机为ubuntu24.04,推荐ubuntu 24.04 risc-v版, 安装ubuntu 24.04 risc-v基本步骤: 1, sudo apt update sudo apt install opensbi qemu-system-misc…