动手学深度学习——矩阵

1. 基本概念

1.1 标量

标量由只有一个元素的张量表示。 所以标量计算与程度开发中的普通变量计算没有差异。

import torch

x = torch.tensor(3.0)
y = torch.tensor(2.0)

x + y, x * y, x / y, x**y
(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))

1.2 向量

向量泛化自标量,可以被视为标量值组成的列表,相当于把标量从零阶推广到一阶,这些标量值被称为向量的元素。

在深度学习中,使用一维张量表示向量,可以理解为一维数组。

  • 使用下标来引用向量的任一元素。
  • 向量的长度通常称为向量的维度。
  • 可以通过张量的.shape属性访问向量的长度。 形状(shape)列出了张量沿每个轴的长度(维数)。
  • 单个向量的默认方向为列向量。
x = torch.arange(4)
x
> tensor([0, 1, 2, 3])
x[3]
> tensor(3)
len(x)
> 4

x.shape
> torch.Size([4])

1.3 矩阵

矩阵将向量从一阶推广到二阶,它是一个具有两个轴的张量,数学中采用大写字母表示。

  • m行n列组成的矩阵,形状表示为(m, n), 当m=n时,则变为方阵。
A = torch.arange(20).reshape(5, 4)
A
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])

当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。

A.T
>
tensor([[ 0,  4,  8, 12, 16],
        [ 1,  5,  9, 13, 17],
        [ 2,  6, 10, 14, 18],
        [ 3,  7, 11, 15, 19]])

方阵有一种特殊类型是对称矩阵,特点:对称矩阵的转置是矩阵本身。

B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B
> tensor([[1, 2, 3],
        [2, 0, 4],
        [3, 4, 5]])

B == B.T
> tensor([[True, True, True],
        [True, True, True],
        [True, True, True]])

1.4 张量

向量是一阶张量,矩阵是二阶张量,但实际上张量可以表示更多阶,n阶矩阵,n个轴,n维数组。

张量在处理图像时特别有用,图像常常以n维数组形式出现, 3个轴分别对应于高度、宽度和颜色通道(channel)轴。

X = torch.arange(24).reshape(2, 3, 4)
X

>tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])

1.5 计算基本性质

张量的运算基本是围绕元素进行计算,有以下特性:

  1. 任何按元素的一元运算都不会改变其操作数的形状。
  2. 相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B
# A
(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [12., 13., 14., 15.],
         [16., 17., 18., 19.]]),

# 一元运算: A * 2
tensor([[ 0.,  2.,  4.,  6.],
         [ 8., 10., 12., 14.],
         [16., 18., 20., 22.],
         [24., 26., 28., 30.],
         [32., 34., 36., 38.]]))
# 二元运算:A * B
tensor([[  0.,   1.,   4.,   9.],
        [ 16.,  25.,  36.,  49.],
        [ 64.,  81., 100., 121.],
        [144., 169., 196., 225.],
        [256., 289., 324., 361.]])

2. 常见计算

2.1 降维求和

降维主要用于减少数据的维度,从而降低模型的复杂度、减少计算量,并且可以帮助减少过拟合的风险。降维可以使得数据更易于处理和理解,同时可以提高模型的泛化能力。

降维的手段一般是沿着某一个轴求和,从而降低张量的维度。

如前面的二维矩阵A

# 求和前的形状: A, A.shape
(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [12., 13., 14., 15.],
         [16., 17., 18., 19.]]),
(torch.Size([5, 4])

沿着0轴对所有行元素求和,输入轴0的维数在输出形状中消失。

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape

> (tensor([40., 45., 50., 55.]), torch.Size([4]))

如果同时给两个轴求和,则二维张量将降为一个元素的标量

A.sum(axis=[0, 1])  # 结果和A.sum()相同
> tensor(190.)

一个与求和相关的量是平均值(mean或average)。 我们通过将总和除以元素总数来计算平均值。

# 这两种计算方式结果相同
A.mean(), A.sum() / A.numel()  
> (tensor(9.5000), tensor(9.5000))

# 计算平均值的函数也可以沿指定轴降低张量的维度。
A.mean(axis=0), A.sum(axis=0) / A.shape[0]
> (tensor([ 8.,  9., 10., 11.]), tensor([ 8.,  9., 10., 11.]))

非降维求和:求和时保持维度不变,通过keepdims选项来指定。

sum_A = A.sum(axis=1, keepdims=True)
sum_A

> tensor([[ 6.],
        [22.],
        [38.],
        [54.],
        [70.]])

2.2 向量点积

定义:相同位置按元素乘积的和,常用于加权求和和加权平均的计算。

给定一组由向量x表示的值, 和一组由w表示的权重,x和w和点积可以表示为(x,w),实际上是用x的转置乘以w来进行计算。

  • 一个向量x的平方可以表示为点积(x, x)
  • 当w为非负整数且和为1时,x和w的点积可以表示加权平均。

用途1:神经网络的前向传播中,将输入特征向量与权重矩阵进行点积操作,可以得到每个神经元的加权输入,然后通过激活函数进行非线性变换,从而得到神经网络的输出。

用途2:特征提取,通过不同神经元之间的点积操作,网络可以提取出不同层次的特征信息。

计算方法之dot api:

x = torch.arange(4, dtype = torch.float32)
y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)

# 
> (tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.))

计算方法之乘积再求和:

torch.sum(x * y)

> tensor(6.)

2.3 矩阵向量积

定义:矩阵(m,n) 和一个向量(len=n)相乘,得到一个新的向量(len=m)。

计算过程的本质:矩阵的每一行与向量进行点积运算,得到新向量的每个元素。
注意:这里的向量要当作列向量来看待。

计算方式(以前面的A矩阵和x向量为例):

A.shape, x.shape, torch.mv(A, x)

> (torch.Size([5, 4]), torch.Size([4]), tensor([ 14.,  38.,  62.,  86., 110.]))

2.4 矩阵乘法

定义: 矩阵A(m,k) 和矩阵B (k, n)相乘,得到一个新的矩阵(m, n),前提是A矩阵的列数与B矩阵的行数相等。

计算过程的本质:

  • B矩阵可以看作是n个长度为k的向量
  • AxB等价于对A矩阵进行n次矩阵向量积运算

以前面的A(5, 4) 矩阵为例,新创建一个B(4,3)矩阵, AxB将得到一个(5,3)的新矩阵。

B = torch.ones(4, 3)
torch.mm(A, B)

> tensor([[ 6.,  6.,  6.],
        [22., 22., 22.],
        [38., 38., 38.],
        [54., 54., 54.],
        [70., 70., 70.]])

2.5 范数

范数通常用于衡量向量的大小,可以帮助控制模型参数的大小以及模型的复杂度。

用途:

  • 正则化(Regularization)技术经常使用范数来约束模型的参数,以防止过拟合,提高模型的泛化能力。
  • 在损失函数中加入范数项也可以帮助优化算法更好地收敛。

L2范数记作||x||:是向量所有元素平方和的平方根,欧几里得距离就是一个L2范数。

u = torch.tensor([3.0, -4.0])
torch.norm(u)    # 用于求L2范数

> tensor(5.)

L1范数: 向量元素的绝对值之和。

torch.abs(u).sum()

> tensor(7.)

LP范数:用于对矩阵求范数,是矩阵所有元素平方和的平方根。这里以前面的A矩阵为例:

torch.norm(A)

> tensor(49.6991)

2.6 余弦夹角

范数配合点积,可以计算两个向量之间的夹角余弦值,公式如下:
在这里插入图片描述

a和b分别是两个向量,a·b表示它们的点积,||a||和||b||分别表示它们的范数(即向量的长度)。通过计算点积和范数,我们可以得到两个向量之间夹角的余弦值,进而推导出它们之间的夹角。

import torch

# 定义两个向量
a = torch.tensor([1, 2, 3], dtype=torch.float)
b = torch.tensor([4, 5, 6], dtype=torch.float)

# 计算点积
dot_product = torch.dot(a, b)

# 计算向量a和b的范数
norm_a = torch.norm(a)
norm_b = torch.norm(b)

# 计算夹角余弦值
cosine_similarity = dot_product / (norm_a * norm_b)

print("向量a: ", a)
print("向量b: ", b)
print("a和b的点积: ", dot_product)
print("a的范数:", norm_a)
print("b的范数:", norm_b)
print("夹角余弦值: ", cosine_similarity.item())
向量a:  tensor([1., 2., 3.])
向量b:  tensor([4., 5., 6.])
a和b的点积:  tensor(32.)
a的范数: tensor(3.7417)
b的范数: tensor(8.7750)
夹角余弦值:  0.9746317863464355

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hbase学习笔记

Hbase是什么 HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。它利用Hadoop HDFS作为其文件存储系统,并提供实时的读写的数据库系统。HBase的设计思想来源于Google的BigTable论文,是Apache的Hadoop项目的子项目。它适合于存储大表数据,并可以达到实时级别。HB…

部署YUM仓库及NFS共享服务

YUN仓库服务 YUM概述 基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由YUM集中的软件仓库提供 yum软件仓库的常用类型 本地源仓库:baserulfile:// 在线源仓库:baserulhttp:// 或 https:// ftp源仓库:baserulftp:// RPM…

【Java那些事】关于前端收到后端返回的时间格式“2024-04-28T14:48:41“非想要的格式

问题: 后端操作后返回时间格式是"2024-04-28T14:48:41" 而我们想要的是:"2024-04-28 14:48:41", 两个解决方法: 方法一:使用 JsonFormat注解 Data AllArgsConstructor NoArgsConstructor public class Use…

代码随想录算法训练营第五十一天| LeetCode309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

一、LeetCode309.最佳买卖股票时机含冷冻期 题目链接/文章讲解/视频讲解:https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E6%97%B6%E6%9C%BA%E5%90%AB%E5%86%B7%E5%86%BB%E6%9C%9F.html 状态:已解决 1.思路 …

实验一: 设备密码配置与远程管理

1.实验环境 用路由器和交换机搭建实验环境 2.需求描述 实现管理员主机对交换机和路由器的远程管理 设备上配置的密码都要被加密 3.推荐步骤 对路由器配置的步骤如下: 实现路由器和PC的连通性配置VTY密码和特权模式密码在PC上Telnet 到路由器。 对交换机配置的…

03-JAVA设计模式-观察者模式

观察者模式 什么是观察者模式 Java中的观察者模式是一种常见的设计模式,它允许对象(观察者)订阅另一个对象(被观察者)的状态变化,并在状态变化时自动得到通知。 核心: 观察者模式主要用于1&a…

HTML学习笔记(二)

1.HTML图像 图像标签&#xff08;<img>)和源属性&#xff08;src&#xff09; HTML中&#xff0c;图像由<img>标签来定义&#xff0c;<img>是空标签&#xff0c;只包含属性&#xff0c;没有闭合标签。在页面上显示图像需要使用源属性&#xff08;src),src是指…

Docker基本操作 Linux里边操作

docker镜像操作命令: docker images:查看所有镜像; docker rmi:删除镜像 后边可以跟镜像的名字或者id指定要删除的镜像&#xff1b; docker pull:拉取镜像&#xff1b; docker push:推送镜像到服务&#xff1b; docker save :打包镜像 后边有用法; docker load:加载镜像&…

前端JS必用工具【js-tool-big-box】,字符串反转,驼峰转换以及版本号对比

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是针对字符串反转&#xff0c;aa-bb-cc转驼峰&#xff0c;以及版本号对比的内容 目录 1 安装和引入 2 字符串反转 3 带有横岗的转驼峰 3.1 转小驼峰 3…

docker-compose编排集成工具,

一、引言 我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器&#xff0c;如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案&#xff0c;今天给大家介绍 Docker 官方产品 Docker-Compose Dockerfile 可以定义一个单独的应用容器&#xff1…

linux,从零安装mysql 8.0.30 ,并且更新至mysql 8.0.36

前言&#xff1a; 系统使用的CentOS 7&#xff0c;系统默认最小安装。 一、基础配置 配置虚拟机IP&#xff0c;需要更改的内容&#xff0c;如下红框中 修改之后 至此&#xff0c;基础配置完成。注意&#xff1a;此处虚拟机网络适配器使用的是&#xff1a;桥接模式 二、软件…

【问题实操】银河麒麟高级服务器操作系统实例,CPU软锁报错触发宕机

1.服务器环境以及配置 处理器&#xff1a; Kunpeng 920 内存&#xff1a; 256G DDR4 整机类型/架构&#xff1a; TaiShan 200 (Model 2280) 内核版本 4.19.90-23.8.v2101.ky10.aarch64 2.问题现象描述 两台搭载麒麟v10 sp1的机器均在系统CPU软锁报错时&#xff0c;触…

Springboot+mybatis升级版(Postman测试)

一、项目结构 1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apach…

高级数据结构与算法期中测试题

一、判断题 1、In dynamic programming algorithms, some results of subproblems have to be stored even they do not compose the optimal solution of a larger problem. T F 解析:T。在动态规划算法中,必须存储子问题的某些结果,因为他们可能需要用来…

区块链技术:NFG元宇宙电商模式

大家好&#xff0c;我是微三云周丽 随着互联网技术的迅猛发展&#xff0c;电子商务行业逐渐崛起为现代经济的重要支柱。而在这一浪潮中&#xff0c;元宇宙电商以其独特的商业模式和巨大的发展潜力&#xff0c;成为行业的新宠。其中&#xff0c;NFG作为元宇宙电商模式的代表&am…

【4110】基于小程序实现的名片管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

std::ignore的定义

有个全局变量。 把一个变量赋值给ignore&#xff0c;还行&#xff0c;没有拷贝等动作&#xff0c;不用担心性能损失。 VS2017D:\DevTools\VS2017\VC\Tools\MSVC\14.16.27023\include\tuple// STRUCT _Ignore struct _Ignore{ // struct that ignores assignmentstemplate<…

如何利用 GPT 自我提高写作能力

GPT革命&#xff1a;如何用AI技术重新定义写作 介绍 在我们的数字时代&#xff0c;了解自我提高写作的必要性至关重要。 随着 GPT 的兴起&#xff0c;我们正在见证书写的变革时代。 这篇扩展文章深入探讨了 GPT 如何显着提高写作技能。 拥抱未来&#xff1a; 人工智能时代的写…

Oracle 数据迁移同步优化(三)

简述 CloudCanal 最近再次对其 Oracle 源端数据同步进行了一系列优化&#xff0c;这些优化基于用户在真实场景中的反馈&#xff0c;具备很强的生产级别参考意义。 本文将简要介绍这些优化项&#xff0c;希望带给读者一些收获。 增量事件 SCN 乱序问题MISSING_SCN 事件干扰新…

物联网和互联网有什么区别?从多个方面进行探讨——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网和互联网是现代信息技术的两大重要领域&#xff0c;它们在许多方面有着紧密的联系&#xff0c;但也有着明显的区别。本文将从多个方面对物联网和互联网的区别进行探讨。 首先&#xff0c;从定义上来看&#xff0c;互联网是一种全球…
最新文章