Einops 张量操作快速入门

张量,即多维数组,是现代机器学习框架的支柱。操纵这些张量可能会变得冗长且难以阅读,尤其是在处理高维数据时。Einops 使用简洁的符号简化了这些操作。

Einops (Einstein-Inspired Notation for operations),受爱因斯坦运算符号启发的张量操作库,已成为AI工程师无缝操控张量以产生AI的必备工具。这是我编写的简单教程,旨在帮助没有 Einops 经验的人创建复杂而实用的神经网络。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

在开始之前,让我们先使用 pip 安装 Einops:

pip install einops

1、Einops的3个基本操作

Einops 围绕三个核心操作:重排、规约和重复。让我们通过示例深入探讨每个操作。

1.1 重排

重排(rearrange)让你可以通过一个容易看懂的操作符改变张量的维度和形状。

import torch
from einops import rearrange# Create a 4D tensor of shape (batch, channels, height, width)
tensor = torch.rand(10, 3, 32, 32)  # Example: a batch of 10 RGB images 32x32
# Rearrange to (batch, height, width, channels) for image processing libraries that expect this format
rearranged = rearrange(tensor, 'b c h w -> b h w c')

上面的操作将通道 c移至最后一个维度,这是 matplotlib 等库中图像处理的常见要求。

1.2 规约

规约(reduce) 对张量的指定维度(如总和、平均值或最大值)应用规约操作,从而简化张量聚合任务。

from einops import reduce# Reduce the tensor's channel dimension by taking the mean, resulting in a grayscale image
grayscale = reduce(tensor, 'b c h w -> b h w', 'mean')

此操作通过对通道 c 进行平均,将我们的 RGB 图像转换为灰度图像。

1.3 重复

重复(repeat)沿任意维度复制张量,从而轻松实现数据增强或张量扩展。

from einops import repeat# Repeat each image in the batch 4 times along a new dimension
repeated = repeat(tensor, 'b c h w -> (repeat b) c h w', repeat=4)

上面的操作通过重复每个图像来增加数据集的大小,这对于数据增强非常有用。

2、Einops的高级模式

Einops 以其直观处理复​​杂重塑模式的能力而出名。

2.1 拆分和合并通道

将 RGB 通道拆分为单独的张量,对其进行处理,然后合并回去。

# Split channels
red, green, blue = rearrange(tensor, 'b (c rgb) h w -> rgb b c h w', rgb=3)# Example processing (identity here)
processed_red, processed_green, processed_blue = red, green, blue
# Merge channels back
merged = rearrange([processed_red, processed_green, processed_blue], 'rgb b c h w -> b (rgb c) h w')

2.2 展平和反展平

展平完全连接层的空间维度,然后反展平。

# Flatten spatial dimensions
flattened = rearrange(tensor, 'b c h w -> b (c h w)')# Example neural network operation
# output = model(flattened)
# Unflatten back to spatial dimensions (assuming output has shape b, features)
# unflattened = rearrange(output, 'b (c h w) -> b c h w', c=3, h=32, w=32)

2.3 批量图像裁剪

批量裁剪图像中心。

# Assuming tensor is batch of images b, c, h, w
crop_size = 24
start = (32 - crop_size) // 2
cropped = rearrange(tensor, 'b c (h crop) (w crop) -> b c h w', crop=crop_size, h=start, w=start)

上面的操作从批次中的每个 32x32 图像中提取居中的 24x24 裁剪图像。

3、高级用例:实现注意力机制

注意力机制,尤其是自注意力(self attention),已成为现代深度学习架构(如 Transformers)的基石。让我们看看 Einops 如何简化自注意力机制的实现。

自注意力允许模型衡量输入数据不同部分的重要性。它是使用从输入数据中得出的查询 (Q)、键 (K) 和值 (V) 来计算的。

3.1 示例:简化的自注意力

为简单起见,我们将演示自注意力的基本版本。请注意,实际实现(如 Transformers 中的实现)包括掩码和缩放等其他步骤。

import torch
import torch.nn.functional as F
from einops import rearrangedef simplified_self_attention(q, k, v):"""A simplified self-attention mechanism.Args:q, k, v (torch.Tensor): Queries, Keys, and Values. Shape: [batch_size, num_tokens, feature_dim]Returns:torch.Tensor: The result of the attention mechanism."""# Compute the dot product between queries and keysscores = torch.matmul(q, k.transpose(-2, -1))# Apply softmax to get probabilitiesattn_weights = F.softmax(scores, dim=-1)# Multiply by valuesoutput = torch.matmul(attn_weights, v)return output
# Example tensors representing queries, keys, and values
batch_size, num_tokens, feature_dim = 10, 16, 64
q = torch.rand(batch_size, num_tokens, feature_dim)
k = torch.rand(batch_size, num_tokens, feature_dim)
v = torch.rand(batch_size, num_tokens, feature_dim)
# Apply self-attention
attention_output = simplified_self_attention(q, k, v)
print("Output shape:", attention_output.shape)

在此示例中,为简单起见,使用 torch.matmul 来计算点积。Einops 在这些操作之前或之后重新排列张量时特别有用,可确保它们在矩阵乘法等操作中正确对齐。

3.2 进一步利用 Einops

除了基本的重排、规约和重复之外,Einops 还可用于更复杂的张量操作,这在多头注意力中经常遇到,其中将特征维度拆分为多个“头”可以简洁地表达:

def multi_head_self_attention(q, k, v, num_heads=8):"""Multi-head self-attention using Einops for splitting and merging heads."""batch_size, num_tokens, feature_dim = q.shapehead_dim = feature_dim // num_heads# Split into multiple headsq, k, v = [rearrange(x, 'b t (h d) -> b h t d', h=num_heads)for x in (q, k, v)]# Apply self-attention to each headoutput = simplified_self_attention(q, k, v)# Merge the heads backoutput = rearrange(output, 'b h t d -> b t (h d)')return output# Apply multi-head self-attention
multi_head_attention_output = multi_head_self_attention(q, k, v)
print("Multi-head output shape:", multi_head_attention_output.shape)

此示例展示了 Einops 在轻松处理复杂张量重塑任务方面的强大功能,使您的代码更具可读性和可维护性。

4、结束语

Einops 是一种多功能且功能强大的张量操作工具,可以显著简化深度学习模型中复杂操作的实现。通过掌握 Einops,你将能够编写更简洁、可读和高效的张量操作代码,从而提升你的深度学习项目。无论是实现复杂的神经网络架构(如 Transformers)还是执行基本的张量重塑任务,Einops 都能满足你的需求。


原文链接:Einops 张量操作入门 - BimAnt

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

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

相关文章

BGP、IGP、EGP学习

文章目录 前言边界网关协议(BGP)内部网关协议(IGP)外部网关协议(EGP)联系与区别 前言 本文是对边界网关协议(BGP)、内部网关协议(IGP)和外部网关协议&#x…

linux top命令显示系统资源使用情况

通过这些键盘快捷键和操作,您可以在 top 命令中查看特定的系统资源使用情况,按不同的指标对进程进行排序,以及更好地监视系统的运行情况。 top 或 htop:显示系统资源使用情况,包括 CPU 占用、内存使用以及运行的进程信…

NLP学习与踩坑记录(持续更新版)

NLP学习与踩坑记录(持续更新版) OSError: Cant load tokenizer for bert-base-uncased.google.protobuf.message.DecodeError: Error parsing messageDeepspeed 本博客记录了博主在学习NLP时遇到了各种各样的问题与解决方法,供大家参考&#…

JS最新的关键字和保留字

在JavaScript中,关键字和保留字是用于定义语言语法和特性的特殊标识符。这些关键字和保留字不能被用作变量名、函数名或其他标识符。以下是JavaScript中最新的关键字和保留字的分点表示和归纳: 关键字(Keywords) JavaScript中的…

oracle SCHEDULER

从Oracle 10g开始,推荐使用DBMS_SCHEDULER包,因为它提供了更强大的功能和灵活性,包括更复杂的调度规则、依赖管理和事件驱动等 1. 用法 DBMS_SCHEDULER.CREATE_JOB (job_name IN VARCHAR2,job_type IN VARCHAR2,job…

软件测试流派:深入比较与总结

软件测试流派:深入比较与总结 前言1. 分析流派2. 标准流派3. 质量流派4. 上下文驱动流派5. 敏捷流派流派比较与总结 前言 在现代软件开发中,不同的软件测试流派代表了各自独特的方法论、实践重点和案例应用。理解这些流派的差异有助于选择适合特定项目需…

温度传感器NST175手册阅读

温度传感器NST175手册阅读 首先看芯片的输入和输出:主要关注IIC接口,毕竟是要驱动这个芯片读取温度。在编写此博客时还未对改温度传感器进行调试,只是阅读手册,把需要重点关注的地方标记出来。 一、芯片管脚 二、温度输出格式 …

618大促背后:优秀制造企业如何精准备货?

618这场年中购物盛宴点燃了消费者的热情。而在背后,是许许多多的制造企业在默默发力,对于他们来说,这不仅仅是一个促销的机会,更是一个检验供应链响应速度、库存管理能力以及市场洞察力的关键时刻。那么,优秀的制造企业…

WACV2024检测Detection论文49篇速览

WACV2024 Detection论文摘要速览49篇 Paper1 CLRerNet: Improving Confidence of Lane Detection With LaneIoU 摘要小结: 车道线检测是自动驾驶和驾驶辅助系统中的关键组成部分。现代基于锚点的深度车道检测方法在车道检测基准测试中表现出色。通过初步的实验,我们…

前端菜鸡流水账日记 -- 各类网站(持续更新版)

哈喽大家,这篇文章主要是打算用来放一些我们平时用的到的连接之类的,大多数都是我自己收藏了的,现在和之后如果有新增都会放到这里,持续更新的~~~~ (各种类型的都有) -----------------------------------…

5.卷积神经网络

目录 1.从全连接到卷积分类猫和狗的图片总结2.卷积层一维卷积,二维卷积,三维卷积总结基础卷积的代码实现3.卷积层里的填充和步幅填充步幅总结4.卷积层里的多输入多输出通道多个输入通道多个输出通道多个输入和输出通道1 * 1卷积层总结5.池化层二维最大池化池化层的填充,步幅…

macbook屏幕录制技巧,这2个方法请你收好

在当今数字化时代,屏幕录制成为了一项不可或缺的技能,无论是教学演示、游戏直播,还是软件操作教程,屏幕录制都能帮助我们更直观地传达信息。MacBook作为苹果公司的标志性产品,其屏幕录制功能也备受用户关注。本文将详细…

区区微服务,何足挂齿?

背景 睿哥前天吩咐我去了解一下微服务,我本来想周末看的,结果周末没带电脑,所以只能周一看了。刚刚我就去慕课网看了相关的视频,然后写一篇文章总结一下。这篇文章算是基础理论版,等我之后进行更多的实践,…

Cesium4Unreal - # 011A Http通信

文章目录 Http通信1 思路2 步骤2.1 添加依赖模块2.2 实现Http客户端2.2.1 MyHttpActor.h2.2.1 MyHttpActor.cpp2.3 蓝图代码2.4 数据Http通信 1 思路 在 Unreal Engine中接收 Http数据,我们可以使用Unreal Engine自带的Http支持。 2 步骤 2.1 添加依赖模块 在项目的 Your…

帕金森患者在饮食上需要注意什么

帕金森病患者在饮食上应该遵循以下几个基本原则: 饮食清淡:应多吃新鲜的水果和蔬菜,如苹果、芹菜、菠菜等,以补充维生素和促进胃肠道蠕动。营养均衡:应多吃富含优质蛋白的食物,如鸡蛋、牛奶,以…

Swift开发——元组

Swift语言的数据类型包括整型、浮点型、字符串、布尔型、数组、元组、集合和字典等,本文将详细介绍元组。 01、元组 严格意义上,元组不属于数据类型,而属于数据结构。元组将一些变量或常量或字面量组织成一个有序的序列,索引号从0开始,用圆括号“()”括起来,各个元素间用…

hive 安装 嵌入模式 笔记

$ hive $ HIVE_HOME/bin/schematool -dbType derby –initSchema $ schematool -verbose -validate -dbType derby $HIVE_HOME/bin/hiveserver2 这个启动了先不要关闭,再打开一个终端进行下面的步骤 Beeline -u (用自己的名字和密码) show d…

redis每日一题:Redis哨兵是如何工作的

状态感知: (1)哨兵要知道整个集群的拓扑关系,因此每隔10秒会向master节点发送info命令,返回信息中,包含了每个slave节点的端口号。 (2)向每个master节点特殊的pubsub中发送master当…

毕业答辩PPT:如何在短时间内高效准备?

提起PPT,大家的第一反应就是痛苦。经常接触PPT的学生党和打工人,光看到这3个字母,就已经开始头痛了: 1、PPT内容框架与文案挑战重重,任务艰巨,耗费大量精力。 2、PPT的排版技能要求高,并非易事…

眼镜片怎么洗?眼镜清洗有哪些方法?超声波清洗机能洗眼镜吗?

现在戴眼镜的人有很多,但是所谓的戴眼镜容易,清洗眼镜却是比较难的一件事!不要以为眼镜好像看着不脏,然后随便用眼镜布擦一下就完事了……其实不是的! 眼镜片上面有细小的灰尘颗粒,而随着我们用眼镜布擦眼…