简单总结广播机制

简介: 简单总结广播机制

这部分对矩阵运算有着特殊的影响,包括numpy等。

当两个维度相同的数组相加时,实际就时对应元素相加,很容易想象。

如下:

1453c01f47c841f89dde871c8b580336.png

但是如果维度不同的!!!接下来进行讨论:定义放上来很难懂,我就直接结合图进行理解

问题描述:假设我们有两个矩阵维度分维度不同。正常情况下,两个矩阵直接相加应该是元素对应相加,但是例子中维度不同元素难以对应,就会出现问题。

此时,广播机制的作用就体现了出来,他会将其中维度较小的进行x或y方向的复制,然后相加

图1:y方向的复制

f2296edc36d54ad79b50e27395bb8440.png

图2:x方向的复制

bf6b2a6ee041427ebd8fafbf908c72e5.png

通过上面看,两个矩阵还是有一定规律的,假设,维度较大的为(w, h),那么较小的为(1, h)或(w, 1)即较小维度的矩阵满足其其中一个维度为1,其余维度与较大维度矩阵的维度一致。这也是广播机制应用的条件。其余不满足此条件的无法使用广播机制。

假设我们有下面一段代码:

import torch
l1 = torch.as_tensor([[1, 2], [3, 4], [5, 6]])
l2 = torch.as_tensor([[7, 8]])
print(l1.shape)
print(l2.shape)
print(l1 + l2)

因为l1维度为(3, 2),l2维度为(1, 2)。l2为维度较小的矩阵,其中第一维度为1,第二维度与l1相同,满足广播机制触发条件,因此可以相加。结果如下:

torch.Size([3, 2])
torch.Size([1, 2])
tensor([[ 8, 10],
        [10, 12],
        [12, 14]])

就是类似上面图2的过程

这是二维上面的,如果是三维的可以吗?一段代码进行尝试:

l1 = torch.as_tensor([[[1, 2], [3, 4], [5, 6]]])
l2 = torch.as_tensor([[[7, 8]], [[9, 10]]])
print(l1.shape)
print(l2.shape)
print(l1 + l2)
print((l1 + l2).shape)

l1维度是(1, 3, 2),l2维度是(2, 1, 2)。运行以下代码,是可以通过的!!!

torch.Size([1, 3, 2])
torch.Size([2, 1, 2])
tensor([[[ 8, 10],
         [10, 12],
         [12, 14]],
        [[10, 12],
         [12, 14],
         [14, 16]]])
torch.Size([2, 3, 2])

**从上面看,我们三维度的广播机制有些不太符合我们上面总结的广播机制应用条件,但是可以将三维拆开进行理解。**如上面可以拆分为两组二维,分别是l1_1(1,2),l2_1(2, 2)和l1_2(3, 2),l2_2(1, 2),后面与二维操作一致。

相关文章
|
存储 搜索推荐 数据挖掘
|
SQL 机器学习/深度学习 分布式计算
Apache Spark 3.0.0重磅发布 —— 重要特性全面解析
开发了近两年(自2018年10月份至今)的Apache SparkTM 3.0.0正式发布! Apache SparkTM 3.0.0版本包含3400多个补丁,是开源社区做出巨大贡献的结晶,在Python和SQL功能方面带来了重大进展并且将重点聚焦在了开发和生产的易用性上。同时,今年也是Spark开源10周年,这些举措反映了Spark自开源以来,是如何不断的满足更广泛的受众需求以及更多的应用场景
Apache Spark 3.0.0重磅发布 —— 重要特性全面解析
|
Cloud Native Java API
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
|
8月前
|
机器学习/深度学习 存储 文字识别
Llama 4上线魔搭社区!社区推理、微调实战教程来啦!
近期,Meta推出了Llama 4系列的首批模型: Llama 4 Scout 和 Llama 4 Maverick。
639 12
|
11月前
|
人工智能 自然语言处理 算法
打破AI信息差:2024年20款好用的人工智能工具大盘点
本文带你了解20款值得一试的AI工具,帮助你在内容创作、图像设计、音频视频编辑等领域提高效率、激发创意。
1565 1
打破AI信息差:2024年20款好用的人工智能工具大盘点
|
Java API 调度
掌握Java线程状态:从NEW到TERMINATED
本文探讨了操作系统与Java中线程的状态及其转换。操作系统层面,线程状态包括初始、就绪、运行、阻塞和终止。Java线程状态则细分为NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,并详细介绍了各状态的特性和转换条件。此外,还列举了Java中常用的线程方法,如`wait()`、`notify()`、`start()`和`join()`等,帮助理解线程控制机制。
333 3
掌握Java线程状态:从NEW到TERMINATED
在有限的数据量下,如何通过正则化技术或dropout来减轻过拟合风险
在有限的数据量下,如何通过正则化技术或dropout来减轻过拟合风险
|
存储 容器
内存越界访问(Out-of-Bounds Access)
【10月更文挑战第12天】
1415 2
|
编解码 算法 IDE
Python实现数据加密-解密
Python实现数据加密-解密
275 0
|
运维 Kubernetes Docker
Kubernetes 1.24 1.25 集群使用docker作为容器
在新版本Kubernetes环境(1.24以及以上版本)下官方不在支持docker作为容器运行时了,若要继续使用docker 需要对docker进行配置一番。需要安装cri-docker作为Kubernetes容器
2846 2