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.hqwc.cn/news/285263.html

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

相关文章

vue 学习笔记

生命周期 1&#xff09;定义&#xff1a;vue实例从创建到销毁的过程 2&#xff09;钩子函数 2.1&#xff09;beforeCreate&#xff1a;vue实例初始化之前调用&#xff0c;这个阶段vue实例刚刚在内存中创建&#xff0c;此时data和methods这些都没初始化好。 2.2&#xff09;Cre…

【计算机网络】TCP协议——1.报文格式详解

前言 上篇讲解了UDP报文格式。TCP和UDP是同层协议&#xff0c;都属于传输层&#xff0c;数据来源于上层——应用层 目录 一. TCP协议概述 二. TCP报文格式 1. 两个问题 2. 确认号和序列号 3. 标志位字段 4. 窗口大小 5. 校验和字段 6. 紧急指针与紧急数据 7. 选项字…

v0.12.0-敏感词/脏词词标签能力进一步增强

拓展阅读 敏感词工具实现思路 DFA 算法讲解 敏感词库优化流程 java 如何实现开箱即用的敏感词控台服务&#xff1f; 各大平台连敏感词库都没有的吗&#xff1f; v0.10.0-脏词分类标签初步支持 v0.11.0-敏感词新特性&#xff1a;忽略无意义的字符&#xff0c;词标签字典 …

nodejs+vue+微信小程序+python+PHP国漫推荐系统-计算机毕业设计推荐

使得本系统的设计实现具有可使用的价。做出一个实用性好的国漫推荐系统&#xff0c;使其能满足用户的需求&#xff0c;并可以让用户更方便快捷地国漫推荐。这个系统的设计主要包括系统页面的设计和方便用户互动的后端数据库&#xff0c;在开发后需要良好的数据处理能力、友好的…

Redis设计与实现之Lua 脚本

目录 一、 Lua 脚本 1、初始化 Lua 环境 2、脚本的安全性 3、脚本的执行 4、 EVAL 命令的实现 定义 Lua 函数 执行 Lua 函数 5、 EVALSHA 命令的实现 二、 小结 一、 Lua 脚本 Lua 脚本功能是 Reids 2.6 版本的最大亮点&#xff0c;通过内嵌对 Lua 环境的支持&#xf…

助力智能人群检测计数,基于YOLOv6开发构建通用场景下人群检测计数系统

在一些人流量比较大的场合&#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下&#xff0c;密切关注当前系统所承载的人流量是十分必要的&#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段&#xff0c;本文的主要目的是想要…

使用Kaptcha实现的验证码功能

目录 一.需求 二.验证码功能实现步骤 验证码 引入kaptcha依赖 完成application.yml配置文件 浏览器显示验证码 前端页面 登录页面 验证成功页面 后端 此验证码功能是以SpringBoot框架下基于kaptcha插件来实现的。 一.需求 1.页面生成验证码 2.输入验证码&#xff…

【uniapp小程序-上拉加载】

在需要上拉加载的页面的page.json上添加红框框里面的 onReachBottom() {if(this.commentCurrent<this.commentTotal){this.commentCurrent 1; this.commentList();this.status loading;}else{this.status ;} }, methods:{commentList(){let params {courseid:this.cour…

人工智能_机器学习069_SVM支持向量机_网格搜索_交叉验证参数优化_GridSearchCV_找到最优的参数---人工智能工作笔记0109

然后我们再来说一下SVC支持向量机的参数优化,可以看到 这次我们需要,test_data这个是测试数据,容纳后 train_data这个是训练数据 这里首先我们,导出 import numpy as np 导入数学计算包 from sklearn.svm import SVC 导入支持向量机包 分类器包 def read_data(path): wit…

单片机计数功能

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、计数器是什么&#xff1f;1.1 应用 二、计数器原理框图及对输入信号的要求2.1 原理框图2.2对输入信号的要求 三、使用步骤3.1 配置为计数模式3.2 装初值3.3…

美颜SDK技术对比,深入了解视频美颜SDK的工作机制

如何在实时视频中呈现更加自然、美丽的画面&#xff0c;而这正是美颜SDK技术发挥作用的领域之一。本文将对几种主流视频美颜SDK进行深入比较&#xff0c;以揭示它们的工作机制及各自的优劣之处。 随着科技的不断进步&#xff0c;美颜技术已经从简单的图片处理发展到了视频领域…

安卓小练习-校园闲置交易APP(SQLite+SimpleCursorAdapter适配器)

环境&#xff1a; SDK&#xff1a;34 JDK&#xff1a;20.0.2 编写工具&#xff1a;Android Studio 2022.3.1 整体效果&#xff08;视频演示&#xff09;&#xff1a; 小练习-闲置社区APP演示视频-CSDN直播 部分效果截图&#xff1a; 整体工作流程&#xff1a; 1.用户登录&…