Einops 张量操作快速入门

news2024/10/7 18:20:28

张量,即多维数组,是现代机器学习框架的支柱。操纵这些张量可能会变得冗长且难以阅读,尤其是在处理高维数据时。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 rearrange

def 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 keys
    scores = torch.matmul(q, k.transpose(-2, -1))
    
    # Apply softmax to get probabilities
    attn_weights = F.softmax(scores, dim=-1)
    
    # Multiply by values
    output = 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.shape
    head_dim = feature_dim // num_heads
    
    # Split into multiple heads
    q, 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 head
    output = simplified_self_attention(q, k, v)
    
    # Merge the heads back
    output = 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.coloradmin.cn/o/1834014.html

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

相关文章

CentOS 7 下gdb任意版本的升级

文章目录 前言查看gdb版本升级步骤 小结 前言 在做项目的过程中,遇到了难缠的bug,使用gdb调试的时候,bt调用堆栈看的一震头疼,于是就想起把gdb升级一下 当前环境:Centos7,gdb:7.6 稍微好看了那…

SpringCloudStream原理和深入使用

简单概述 Spring Cloud Stream是一个用于构建与共享消息传递系统连接的高度可扩展的事件驱动型微服务的框架。 应用程序通过inputs或outputs来与Spring Cloud Stream中binder对象交互,binder对象负责与消息中间件交互。也就是说:Spring Cloud Stream能…

AI工具快速制作爆火的影视视频混剪

今天给大家发一个有意思的工具,影视混剪大家应该都刷到过,像下面这种视频,播放量都超级高。 这种视频都是怎么做的呢? 现在AI工具这么多样性,先用 AI 写一段具有网感的对话段子,然后找影视剧片段混剪成一…

笑脸金融测试社招面经,期望20K

面经哥只做互联网社招面试经历分享,关注我,每日推送精选面经,面试前,先找面经哥 测试总监一面 1、问一些测试理论相关的知识。 自我介绍、质量模型 2、登录如何设计测试用例。 3、给你一个东西你会从哪些方面去考虑设计测试用…

【数据结构初阶】--- 堆的应用:topk

堆的功能:topk 为什么使用topk 先举个例子,假如说全国有十万家奶茶店,我现在想找到评分前十的店铺,现在应该怎么实现? 第一想法当然是排序,由大到小排序好,前十就能拿到了。这是一种方法&…

2024 年最新 Python 基于 LangChain 框架基础案例详细教程(更新中)

LangChain 框架搭建 安装 langchain pip install langchain -i https://mirrors.aliyun.com/pypi/simple/安装 langchain-openai pip install langchain-openai -i https://mirrors.aliyun.com/pypi/simple/ChatOpenAI 配置环境变量 环境变量 OPENAI_API_KEYOpenAI API 密钥…

在IDEA 2024.1.3 (Community Edition)中创建Maven项目

本篇博客承继自博客Windows系统Maven下载安装-CSDN博客 Maven版本:maven-3.9.5 修改设置: 首先先对Idea的Maven依赖进行设置;打开Idea,选择“Costomize”,选择最下边的"All settings" 之后找到Maven选项&…

聚四氟乙烯离心管 四氟反应管 消解管 PTFE螺口带盖管 特氟龙试管

一、产品介绍 样品悬浮液盛放在管状试样容器中,在离心机的高速旋转下,由于巨大的离心力作用,使悬浮的微小颗粒 以一定的速度沉降,从而与溶液得以分离。这种带密封盖或压盖的管状试样容器,就是离心管。 PTFE离心管&…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 03:强化你的子系统

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

【面试干货】常见的编译时异常(运行时异常)及其处理

【面试干货】常见的编译时异常(运行时异常)及其处理 1、SQLException2、IOException3、FileNotFoundException4、ClassNotFoundException5、EOFException6、总结 💖The Begin💖点点关注,收藏不迷路💖 在Jav…

电能表厂家的研发能力是实力的体现

电能表厂家的研发能力无疑是其整体实力的核心体现。一个拥有强大研发能力的电能表厂家,不仅能够持续推出具有竞争力的新产品,满足市场需求,还能引领行业发展,塑造企业品牌形象。 一、研发能力对电能表厂家的重要性 研发能力是电…

图纸管理的方法、图纸管理软件

图纸管理是一个复杂且关键的过程,它涉及到图纸的创建、存储、共享、修改、审核、存档和检索等多个环节。以下是根据参考文章总结的图纸管理的具体内容和方法: 一、图纸管理的目的 1、确保图纸的准确性:通过规范的管理流程和质量控制措施&…

Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.8:

Mvan 点击执行 mvn install https://repo1.maven.org/maven2/org/apache/maven/plugins/maven-antrun-plugin/1.8/maven-antrun-plugin-1.8.pom

小米手机怎么用代理换ip:步骤详解与实用指南

在数字化时代,网络安全与隐私保护日益受到重视。对于小米手机用户而言,使用代理换IP已成为提升网络安全性、访问特定网站或绕过地域限制的有效手段。本文将详细介绍如何在小米手机上设置代理以更换IP地址,帮助用户更好地保护个人信息和享受更…

【NOI-题解】1448. 随机体能测试1469. 数的统计1511. 数字之和为13的整数1846. 阿尔法乘积

文章目录 一、前言二、问题问题:1448. 随机体能测试问题:1469. 数的统计问题:1511. 数字之和为13的整数问题:1846. 阿尔法乘积 三、感谢 一、前言 本章节主要对嵌套循环的题目进行讲解,包括《1448. 随机体能测试》《1…

Swift开发——存储属性与计算属性

Swift语言开发者建议程序设计者多用结构体开发应用程序。在Swift语言中,结构体具有了很多类的特性(除类的与继承相关的特性外),具有属性和方法,且为值类型。所谓的属性是指结构体中的变量或常量,所谓的方法是指结构体中的函数。在结构体中使用属性和方法是因为:①匹别于结…

泛微开发修炼之旅--19ecode获取用户人员信息方案汇总及代码示例(含pc端和移动端)

文章详情链接:19ecode获取用户人员信息方案汇总及代码示例(含pc端和移动端)

Android Basis - Google Keybox

什么是Keybox Keybox 又称为Gooogle attestation key,是Google用于管理、统计运行GMS套件设备的一种手段。 通常我们会向Google申请keybox,结合可能得出货量,提供如下信息给到的Google。 1. fingerprint 2. device id 列表 举个例子&am…

(done) AFL 都有哪些阶段? Stage progress

参考资料:https://afl-1.readthedocs.io/en/latest/user_guide.html 所有阶段如下,包括详细的解释

下载lombok.jar包,简化类的代码

Download (projectlombok.org) 去这个网站下载lombok.jar包 打开这个包文件的位置,拖到项目lib文件夹: 在这里右键添加为库(Add as library)。 添加这三个注解即可,类里面不需要其他东西了