Pytorch nn.Linear()的基本用法与原理详解及全连接层简介

主要引用参考:
https://blog.csdn.net/zhaohongfei_358/article/details/122797190
https://blog.csdn.net/weixin_43135178/article/details/118735850

nn.Linear的基本定义

nn.Linear定义一个神经网络的线性层,方法签名如下:

torch.nn.Linear(in_features, # 输入的神经元个数out_features, # 输出神经元个数bias=True # 是否包含偏置)

Linear其实就是对输入 X n × i X_{n\times i} Xn×i执行了一个线性变换,即:
Y n × o = X n × i W i × o + b Y_{n\times o}=X_{n\times i}W_{i\times o}+b Yn×o=Xn×iWi×o+b
其中 W W W是模型想要学习的参数, W W W的维度为 W i × o W_{i\times o} Wi×o,b是o维的向量偏置,n为输入向量的行数(例如,你想一次输入10个样本,即batch_size为10,则n=10),i为输入神经元的个数(例如你的样本特征为5,则i=5),o为输出神经元的个数。

示例:

from torch import nn
import torchmodel = nn.Linear(2, 1) # 输入特征数为2,输出特征数为1
input = torch.Tensor([1, 2]) # 给一个样本,该样本有2个特征(这两个特征的值分别为1和2)
output = model(input)
output
tensor([-1.4166], grad_fn=<AddBackward0>)

我们的输入为[1,2],输出了[-1.4166]。可以查看模型参数验证一下上述的式子:

# 查看模型参数
for param in model.parameters():print(param)
Parameter containing:
tensor([[ 0.1098, -0.5404]], requires_grad=True)
Parameter containing:
tensor([-0.4456], requires_grad=True)

可以看到,模型有3个参数,分别为两个权重和一个偏执。计算可得:
y = [ 1 , 2 ] ∗ [ 0.1098 , − 0.5404 ] T − 0.4456 = − 1.4166 y=[1,2]*[0.1098,-0.5404]^T-0.4456=-1.4166 y=[1,2][0.1098,0.5404]T0.4456=1.4166


实战

假设我们的一次输入三个样本A,B,C(即batch_size为3),每个样本的特征数量为5:

A: [0.1,0.2,0.3,0.3,0.3]
B: [0.4,0.5,0.6,0.6,0.6]
C: [0.7,0.8,0.9,0.9,0.9]

则我们的输入向量 X 3 × 5 X_{3\times 5} X3×5为:

X = torch.Tensor([[0.1,0.2,0.3,0.3,0.3],[0.4,0.5,0.6,0.6,0.6],[0.7,0.8,0.9,0.9,0.9],
])
X
tensor([[0.1000, 0.2000, 0.3000, 0.3000, 0.3000],[0.4000, 0.5000, 0.6000, 0.6000, 0.6000],[0.7000, 0.8000, 0.9000, 0.9000, 0.9000]])

定义线性层,我们的输入特征为5,所以in_feature=5,我们想让下一层的神经元个数为10,所以out_feature=10,则模型参数为: W 5 × 10 W_{5\times 10} W5×10

model = nn.Linear(in_features=5, out_features=10, bias=True)

经过线性层,其实就是做了一件事,即:
Y 3 × 10 = X 3 × 5 W 5 × 10 + b Y_{3\times 10}=X_{3\times 5}W_{5\times 10}+b Y3×10=X3×5W5×10+b
具体表示为:
[ Y 00 Y 01 ⋯ Y 08 Y 09 Y 10 Y 11 ⋯ Y 18 Y 19 Y 20 Y 21 ⋯ Y 28 Y 29 ] = [ X 00 X 01 X 02 X 03 X 04 X 10 X 11 X 12 X 13 X 14 X 20 X 21 X 22 X 23 X 23 ] [ W 00 W 01 ⋯ W 08 W 09 W 10 W 11 ⋯ W 18 W 19 W 20 W 21 ⋯ W 28 W 29 W 30 W 31 ⋯ W 38 W 39 W 40 W 41 ⋯ W 48 W 49 ] + b \begin{equation} \left[ \begin{array}{ccc} Y_{00} & Y_{01} &\cdots & Y_{08} &Y_{09} \\ Y_{10} & Y_{11} &\cdots & Y_{18} &Y_{19} \\ Y_{20} & Y_{21} &\cdots & Y_{28} &Y_{29} \end{array} \right] =\left[ \begin{array}{ccc} X_{00} & X_{01} &X_{02} & X_{03} &X_{04} \\ X_{10} & X_{11} &X_{12} & X_{13} &X_{14} \\ X_{20} & X_{21} &X_{22} & X_{23} &X_{23} \end{array}\nonumber \right] \left[ \begin{array}{ccc} W_{00} & W_{01} &\cdots & W_{08} &W_{09} \\ W_{10} & W_{11} &\cdots & W_{18} &W_{19} \\ W_{20} & W_{21} &\cdots & W_{28} &W_{29} \\ W_{30} & W_{31} &\cdots & W_{38} &W_{39} \\ W_{40} & W_{41} &\cdots & W_{48} &W_{49} \\ \end{array} \right] +b \end{equation}\nonumber Y00Y10Y20Y01Y11Y21Y08Y18Y28Y09Y19Y29 = X00X10X20X01X11X21X02X12X22X03X13X23X04X14X23 W00W10W20W30W40W01W11W21W31W41W08W18W28W38W48W09W19W29W39W49 +b

个人的理解:比如 X X X第一行和 W W W矩阵的第一列相乘就相当于对样本A做了全局卷积,最后得到了1个特征,因为 W W W有10列,所以最后得到10个特征,也就是把5个特征转变为了10个特征。

其中 X i . X_i. Xi.就表示第i个样本, W . j W_{.j} W.j表示所有输入神经元到第j个输出神经元的权重。
在这里插入图片描述

注意:这里图有点问题,应该是 W 00 , W 01 , W 02 , . . . , W 07 , W 08 , W 09 W_{00}, W_{01}, W_{02}, ..., W_{07}, W_{08},W_{09} W00,W01,W02,...,W07,W08,W09(我没觉得图有问题)

因为有三个样本,所以相当于依次进行了三次 Y 3 × 10 = X 3 × 5 W 5 × 10 + b Y_{3\times 10}=X_{3\times 5}W_{5\times 10}+b Y3×10=X3×5W5×10+b,然后再将三个 Y 1 × 10 Y_{1\times 10} Y1×10叠在一起

经过线性层后,我们最终的到了3×10维的矩阵,即 输入3个样本,每个样本维度为5,输出为3个样本,将每个样本扩展成了10维

model(X).size()
torch.Size([3, 10])

全连接层

概述
全连接层 Fully Connected Layer 一般位于整个卷积神经网络的最后,负责将卷积输出的二维特征图转化成一维的一个向量,由此实现了端到端的学习过程(即:输入一张图像或一段语音,输出一个向量或信息)。全连接层的每一个结点都与上一层的所有结点相连因而称之为全连接层。由于其全相连的特性,一般全连接层的参数也是最多的。

主要作用
全连接层的主要作用就是将前层(卷积、池化等层)计算得到的特征空间映射样本标记空间。简单的说就是将特征表示整合成一个值,其优点在于减少特征位置对于分类结果的影响,提高了整个网络的鲁棒性。
全连接在整个网络卷积神经网络中起到“分类器”的作用,如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样本的标记空间的作用。其实,就是把特征整合到一起,方便交给最后的分类器或者回归。

实际操作
在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转换为卷积核为1*1的卷积;而前层是卷积层的全连接层可以转换为卷积核为前层卷积输出结果的高和宽一样大小的全局卷积。

一个通俗的例子:
以VGG-16为例,对224x224x3的输入,最后一层卷积可得输出为7x7x512,如后层是一层含4096个神经元的FC,则可用卷积核为7x7x512x4096的全局卷积来实现这一全连接运算过程,其中该卷积核参数如下:“filter size = 7, padding = 0, stride = 1, D_in = 512, D_out = 4096”经过此卷积操作后可得输出为1x1x4096。如需再次叠加一个2048的FC,则可设定参数为“filter size = 1, padding = 0, stride = 1, D_in = 4096, D_out = 2048”的卷积层操作(个人理解就是用1×1×4096×2048的卷积核来卷积)。(参考:https://www.zhihu.com/question/41037974/answer/150522307)

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

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

相关文章

Linux - 非root用户使用systemctl管理服务

文章目录 方式一 &#xff08;推荐&#xff09;1. 编辑sudoers文件&#xff1a;2. 设置服务文件权限&#xff1a;3. 启动和停止服务&#xff1a; 方式二1. 查看可用服务&#xff1a;2. 选择要配置的服务&#xff1a;3. 创建自定义服务文件&#xff1a;4. 重新加载systemd管理的…

el-date-picker限制选择7天内禁止内框选择

需求&#xff1a;elementPlus时间段选择框需要满足&#xff1a;①最多选7天时间。②不能手动输入。 <el-date-picker v-model"timeArrange" focus"timeEditable" :editable"false" type"datetimerange" range-separator"至&qu…

福德植保无人机工厂:创新科技与绿色农业的完美结合

亲爱的读者们&#xff0c;欢迎来到福德植保无人机工厂的世界。这里&#xff0c;科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者&#xff0c;以其领先的无人机技术&#xff0c;创新的理念&#xff0c;为我们展示了一种全新的农业服…

使用Httpclient来替代客户端的jsonp跨域解决方案

最近接手一个项目&#xff0c;新项目需要调用老项目的接口&#xff0c;但是老项目和新项目不再同一个域名下&#xff0c;所以必须进行跨域调用了&#xff0c;但是老项目又不能进行任何修改&#xff0c;所以jsonp也无法解决了&#xff0c;于是想到了使用了Httpclient来进行服务端…

Vue简介

聚沙成塔每天进步一点点 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每篇文章都致力于提供清晰、深入的参考资料&#xff0c;让你能够更轻松、更自信地理解和掌握 …

[密码学]AES

advanced encryption standard&#xff0c;又名rijndael密码&#xff0c;为两位比利时数学家的名字组合。 分组为128bit&#xff0c;密钥为128/192/256bit可选&#xff0c;对应加密轮数10/12/14轮。 基本操作为四种&#xff1a; 字节代换&#xff08;subBytes transformatio…

PyQt6 QFontDialog字体对话框控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计50条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

【docker】修改docker的数据目录

背景 主节点是分配了较少内存和存储的低配机器&#xff0c;因为我们系统的rancher是用docker镜像启动的&#xff0c;而rancher和docker的默认目录都放在/var/lib下面&#xff0c;而这个/var目录目前只分配10G的存储&#xff0c;导致节点存储报警。因此想修改docker的数据目录&…

中国高分辨率土壤侵蚀因子K

中国高分辨率土壤侵蚀因子K 土壤可蚀性因子&#xff08;K&#xff09;数据&#xff0c;基于多种土壤属性数据计算&#xff0c;所用数据包括土壤黏粒含量&#xff08;%&#xff09;、粉粒含量&#xff08;%&#xff09;、砂粒含量&#xff08;%&#xff09;、土壤有机碳含量&…

鸿蒙系统(HarmonyOS)之方舟框架(ArkUI)介绍

鸿蒙开发官网&#xff1a;HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 方舟开发框架&#xff08;简称&#xff1a;ArkUI&#xff09;&#xff0c;是一套构建HarmonyOS应用界面的UI开发框架&#xff0c;它提供了极简的UI语法与包括UI组件、动画机制、事件交互等在内…

音视频参数介绍

一、视频参数概念 单个视频帧&#xff1a;可以简单地理解成为一张图片 单个视频帧主要的参数概念&#xff1a; 分辨率&#xff1a; 分辨率是指图像或显示器上像素的数量&#xff0c;通常用横向像素数乘以纵向像素数表示。例如&#xff0c;1920x1080 表示宽度为1920像素&…

多维时序 | MATLAB实现WOA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-CNN-LST…

新增工具箱管理功能、重构网站证书管理功能,1Panel开源面板v1.9.0发布

2023年12月18日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.0版本。 在这一版本中&#xff0c;1Panel引入了新的工具箱管理功能&#xff0c;包含Swap分区管理、Fail2Ban管理等功能。此外&#xff0c;1Panel针对网站证书管理功能进行了全面重构&…

Django(一)

1.web框架底层 1.1 网络通信 注意&#xff1a;局域网 个人一般写程序&#xff0c;想要让别人访问&#xff1a;阿里云、腾讯云。 去云平台租服务器&#xff08;含公网IP&#xff09;程序放在云服务器 先以局域网为例 我的电脑【服务端】 import socket# 1.监听本机的IP和…

机器学习算法---时间序列

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

条款5:了解c++默默编写并调用了哪些函数

如果你不自己声明&#xff0c;编译器会替你声明&#xff08;编译器版本的&#xff09;拷贝构造函数、拷贝赋值运算符和析构函数。此外&#xff0c;如果你没有声明任何构造函数&#xff0c;编译器会为你声明一个默认构造函数。 class Empty{};本质上和写成下面这样是一样的: c…

Java小案例-基于javaweb宿舍寝室管理系统

目录 前言 项目介绍 源码获取 前言 《基于javaweb宿舍管理系统》该项目采用技术&#xff1a;jsp servlet mysqljdbccssjs等相关技术 系统功能分为学生管理&#xff0c;宿管管理&#xff0c;楼宇管理&#xff0c;宿舍管理&#xff0c;住宿管理&#xff0c;管理员功能包括学…

MongoDB的查询分析explain和hint

本文主要介绍MongoDB的查询分析explain和hint。 目录 MongoDB的查询分析explainhint MongoDB的查询分析 在MongoDB中&#xff0c;"explain"和"hint"是两个用于查询优化和分析的关键指令。 explain 在MongoDB中&#xff0c;explain()是一个用于查询分析的…

Vue的脚手架

脚手架配置 脚手架文档&#xff1a;Vue CLI npm config set registry https://registry.npm.taobao.org vue.config.js配置选项&#xff1a; 配置参考 | Vue CLI ref选项 ref和id类似&#xff0c;给标签打标识。 document.getElementById(btn); this.$ref.btn; 父子组…

echarts饼图扇形之间设置间距

查看文档以及网上查找&#xff0c;都是将边框颜色设置成和背景色一样&#xff0c;但是当背景是图片的时候就不适用了&#xff0c;试了很多方式都不理想&#xff0c;没办法只能从数据上下手了&#xff0c;最终效果如下图&#xff0c; 思路&#xff1a;将list中的数据每一条后面插…