链接:https://docs.e3nn.org/en/latest/examples/examples.html

在这里插入图片描述


docs:e3nn

e3nn是一个用于构建欧几里得(E(3))等变神经网络的Python库,这意味着它们能自动保持三维旋转和反射的对称性。

该库使用不可约表示(Irreps)来描述数据变换方式,通过张量积以原则性的方式组合这些对称特征。

此外,该库还利用球谐函数处理方向性数据,提供专门的等变神经网络模块(如线性层和激活函数),包含用于稳定训练的归一化策略,并支持TorchScript JIT以实现优化部署。

可视化

在这里插入图片描述

章节列表

  1. 不可约表示(Irreps)
  2. 球谐函数
  3. 张量积
  4. 等变神经网络模块
  5. 归一化
  6. TorchScript JIT支持

e3nn库文档

该库旨在帮助 开发E(3)等变神经网络,包含张量积球谐函数等基础数学运算。

请添加图片描述

快速入门

import torch
from e3nn import o3# 创建由标量(0e)和向量(1o)组成的随机数组
irreps_in = o3.Irreps("0e + 1o")
x = irreps_in.randn(-1)# 应用线性层
irreps_out = o3.Irreps("2x0e + 2x1o")
linear = o3.Linear(irreps_in=irreps_in, irreps_out=irreps_out)
y = linear(x)# 计算自张量积
tp = o3.FullTensorProduct(irreps_in1=irreps_in, irreps_in2=irreps_in)
z = tp(x, x)# 可选:编译张量积运算
tp_pt2 = torch.compile(tp, fullgraph=True)
z_pt2 = tp_pt2(x, x)  # 注意:由于编译过程,前几次调用可能较慢
torch.testing.assert_close(z, z_pt2)

安装指南

重要提示:请先安装PyTorch,再执行以下命令

pip install --upgrade pip
pip install --upgrade e3nn

详细安装说明和可选依赖项请参阅INSTALL.md文件

版本变更说明

e3nn目前处于开发阶段。建议使用pip安装。主分支被视为不稳定版本。当代码发生破坏性变更时,次版本号会递增。

版本号格式:
0.(破坏性变更时递增).(兼容性更新时递增)


第1章:不可约表示(Irreps)

欢迎来到e3nn的精彩世界🐻‍❄️

这个库能帮助我们构建对三维空间中物体行为"有认知"的神经网络,特别是在物体旋转或反射时。

  • 想象训练一个神经网络来理解分子。

  • 当你旋转一个分子时,它仍然是同一个分子!

  • 真正智能的网络应该能识别这一点,而无需展示所有可能的旋转。

这种特性被称为**等变性**,而e3nn使之成为可能。

e3nn的核心是一个称为不可约表示(简称Irreps)的基本概念。

  • 可以将Irreps视为标签,告诉e3nn你的数据代表哪种物理量

  • 这个标签至关重要,因为它决定了当三维世界旋转或反射时,数据应如何表现

让我们从一个简单例子开始。假设你有一个球的两条信息:

  1. 温度:这是一个单一数字。旋转球时,其温度(比如在中心点)不会改变
  2. 位置处的风向和风速:这是一个矢量,既有大小又有方向。旋转球时,风矢量会随之改变旋转。

温度(标量)和风(矢量)在旋转下的表现不同。e3nn需要知道这种差异来构建等变神经网络。这正是Irreps提供的功能

什么是Irrep(单数)?

一个Irrep(发音为"ear-rep")描述一种基本的信息"类型"或"类别",是最小的构建模块

每个Irrep由两个关键属性定义:

  1. l(角动量/阶数):这是一个非负整数(0,1,2,…)

    • l=0:表示标量。如温度示例,标量是旋转坐标系时不变的单一数字。
    • l=1:表示矢量。如风示例,矢量有方向和大小,会随物体旋转。
    • l=2及以上:表示更复杂的量,有时称为张量或多极子,在旋转下以特定方式变换。

    阶数为lIrrep维度总是2l + 1。因此标量(l=0)维度为1,矢量(l=1)维度为3。

  2. p(宇称):取值为+1(偶,记作’e’)或-1(奇,记作’o’)。宇称描述数据在反射(如镜面反射)时的行为:

    • 偶宇称(e):反射后数据保持不变。标量温度(0e)具有偶宇称。
    • 奇宇称(o):反射后数据符号或方向翻转。矢量(1o)具有奇宇称——如果反射一个指向右侧的矢量,它将指向左侧(其分量符号翻转)。

e3nn使用简洁的字符串表示法。例如:

  • 0e:偶宇称标量(l=0)
  • 1o:奇宇称矢量(l=1),这是表示3D矢量的标准方式
  • 2e:偶宇称张量(l=2)

可以在e3nn中这样创建Irrep对象:

from e3nn.o3 import Irrep# 标量(l=0, 偶宇称)
scalar_irrep = Irrep("0e")
print(f"标量Irrep: {scalar_irrep}, l={scalar_irrep.l}, p={scalar_irrep.p}, 维度={scalar_irrep.dim}")# 矢量(l=1, 奇宇称)
vector_irrep = Irrep("1o")
print(f"矢量Irrep: {vector_irrep}, l={vector_irrep.l}, p={vector_irrep.p}, 维度={vector_irrep.dim}")

输出:

标量Irrep: 0e, l=0, p=1, 维度=1
矢量Irrep: 1o, l=1, p=-1, 维度=3

什么是Irreps(复数)?

现实世界的数据通常不是单一标量或矢量,而是不同类型信息的组合

例如空间中的一个点可能同时具有温度(标量)和速度(矢量)。

这时就需要Irreps(复数)。Irreps对象描述多个Irrep类型的集合直和,就像是复杂数据结构的配方。

Irreps的字符串表示法组合了单个Irrep字符串,通常带有"多重性"数字表示特定Irrep类型出现的次数:

  • 1x0e:一个标量(单实例时1x可省略)
  • 2x0e:两个独立标量
  • 0e + 1o:一个标量和一个矢量
  • 3x0e + 5x1o + 2x2e三个标量、五个矢量和两个l=2偶宇称张量

创建Irreps对象的方式:

from e3nn.o3 import Irreps# 一个标量和一个矢量的组合
my_irreps = Irreps("0e + 1o")
print(f"我的Irreps: {my_irreps}")
print(f"总维度: {my_irreps.dim}")# 更复杂的组合
complex_irreps = Irreps("2x0e + 1x1o + 1x2e")
print(f"复杂Irreps: {complex_irreps}")
print(f"总维度: {complex_irreps.dim}")

输出:

我的Irreps: 1x0e+1x1o
总维度: 4
复杂Irreps: 2x0e+1x1o+1x2e
总维度: 9

注意complex_irreps的总维度计算为:
(2 * (2*0 + 1))(两个0e标量) +
(1 * (2*1 + 1))(一个1o矢量) +
(1 * (2*2 + 1))(一个2e张量) =
(2 * 1) + (1 * 3) + (1 * 5) = 2 + 3 + 5 = 10

e3nn如何使用Irreps

Irreps对象本质上是数据在e3nn神经网络中流动的蓝图。

当在e3nn中定义层时,需要指定其输入和输出的Irreps

以下是e3nnREADME中的示例:

import torch
from e3nn import o3# 定义输入数据的Irreps:一个标量和一个矢量的组合
irreps_in = o3.Irreps("0e + 1o")
print(f"输入Irreps: {irreps_in}")# 创建符合这些Irreps的随机输入数据
x = irreps_in.randn(10, -1) # 10个样本,-1会被替换为irreps_in.dim(4)
print(f"输入数据形状: {x.shape}")# 定义输出数据的Irreps:两个标量和两个矢量的组合
irreps_out = o3.Irreps("2x0e + 2x1o")
print(f"输出Irreps: {irreps_out}")# 创建将'irreps_in'数据转换为'irreps_out'数据的线性层
# e3nn确保该层保持旋转/反射等变性
linear = o3.Linear(irreps_in=irreps_in, irreps_out=irreps_out)
print(f"创建的线性层: {linear}")# 将线性层应用于输入数据
y = linear(x)
print(f"输出数据形状: {y.shape}")

输出:

输入Irreps: 1x0e+1x1o
输入数据形状: torch.Size([10, 4])
输出Irreps: 2x0e+2x1o
创建的线性层: Linear(1x0e+1x1o -> 2x0e+2x1o)
输出数据形状: torch.Size([10, 8])

注意o3.Linearirreps_inirreps_out为参数。

这告诉层如何解释其输入以及应产生何种输出,同时保持等变性。

内部机制:Irreps的结构

快速了解e3nn如何存储这些IrrepIrreps对象:

classDiagramdirection LRclass Irrep {+int l+int p+dim: int}class _MulIr {+int mul+Irrep ir+dim: int}class Irreps {+tuple[tuple] internal_structure+dim: int+num_irreps: int}Irreps "1" * "0..*" _MulIr_MulIr "1" * "1" Irrepnote for Irrep: 表示单个不可约表示(如1o)note for _MulIr: 将多重性与Irrep结合(如2x0e)note for Irreps: _MulIr对象的集合(直和)(如2x0e+1x1o)
  1. Irrep:存储为包含(l, p)的简单tuple。例如Irrep("1o")内部是(1, -1),其dim属性计算为2l+1
  2. _MulIr:另一个简单tuple,包含(多重性, Irrep_object)。所以2x0e会是(2, Irrep(0, 1)),其dim计算为多重性 * Irrep_object.dim
  3. Irreps_MulIr对象的tuple。当给出字符串如Irreps("2x0e + 1x1o")时,它会解析字符串,创建_MulIr(2, Irrep(0, 1))_MulIr(1, Irrep(1, -1)),并将它们存储在元组中。其dim属性是所有_MulIr组件维度的总和。

当要求Irreps对象提供其变换矩阵(如通过irreps.D_from_matrix(R))时,e3nn会为每个单独的Irrep计算变换矩阵(使用称为wigner_D的函数,我们将在下一章详细介绍),然后将它们组合成一个大的块对角矩阵。这种块对角结构意味着每种Irrep类型独立变换,这是不可约表示的关键特性。

IrrepIrreps快速对比

特性Irrep(单数)Irreps(复数)
概念单一基本的数据变换类型多个Irrep类型的集合或"直和"
属性l(阶数)和p(宇称)(多重性, Irrep)对的列表
示例0e(标量), 1o(矢量)2x0e + 1o(两个标量和一个矢量)
维度2l + 1所有组件的多重性 * (2l + 1)之和
用途定义单个组件定义e3nn中数据的整体结构

结论

本章中,我们了解到Irrepse3nn中描述数据(如标量或矢量)在旋转和反射下行为的基本"标签"。这种理解对于构建等变神经网络至关重要,这些网络本质上尊重3D空间的对称性。我们学习了如何创建IrrepIrreps对象,以及e3nn如何使用它们来定义其层的输入和输出类型。

下一章中,我们将深入探讨这些Irreps如何通过球谐函数在3D空间中数学表示,这些函数是表达这些旋转和反射场的"基"。

第2章:球谐函数


e3nn 概述

e3nn 是一个用于构建欧几里得等变神经网络(E(3)-equivariant neural networks)的 Python 库,能够自动保持三维旋转和反射的对称性

该库通过不可约表示(Irreps)描述数据变换方式,利用球谐函数处理方向性数据,并提供专门的等变神经网络模块。

核心功能

基于不可约表示的数据描述系统

  • 使用 Irreps 定义数据类型(如标量 0e、矢量 1o
  • 支持组合多种数据类型(如 "0e + 1o" 表示标量矢量组合)

基础数学运算

  • 张量积运算
  • 球谐函数处理

神经网络组件

  • 等变线性层
  • 归一化策略
  • TorchScript JIT 支持

应用示例:

  • 分子性质预测
  • 3D 点云处理

前文传送:[GICP] 点云数据结构 | 点云配准 | KD树 | 常见树状搜索结构

安装与版本

  • 安装简单,但需先安装 PyTorch
  • 该库使用版本号 0.X.Y 格式,次版本号递增表示破坏性变更

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

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

相关文章

深入浅出 ArrayList:从基础用法到底层原理的全面解析(中)

四、ArrayList 常用方法实战 —— 从添加到遍历的全场景覆盖ArrayList 提供了数十个方法,但日常开发中常用的只有 10 个左右,我们按 “元素操作”“集合查询”“遍历方式” 三类来梳理,每个方法都附带示例和注意事项。4.1 元素添加&#xff1…

java后端如何实现下载功能

后端需要把要下载的若干文件 按 ZIP 格式编码成一段二进制字节流,然后以 Content-Type: application/zip Content-Disposition: attachment; filenamexxx.zip 的形式写进 HTTP 响应体。浏览器收到这段“ZIP 格式的字节流”后,就会弹出保存对话框&#xf…

AI生成技术报告:GaussDB与openGauss的HTAP功能全面对比

GaussDB 与 openGauss 的 HTAP 功能比较 前言 GaussDB集中式版本从505.2版本开始引入了HTAP混合负载功能,openGauss也从7.0.0 RC1版本开始引入了HTAP行列融合功能,加强了行存转列存的使用友好度,但两者的实现似乎存在不小的差异。 虽然文档…

小程序开发指南(四)(UI 框架整合)

✍讲解了微信小程序 UI 框架的使用方法和特点,根据项目需求选择合适的组件库。附有相应的组件库预览码,也是将所有的微信小程序原生组件库整合在一起方便后续开发的使用。如果有不好或者有错误的地方请告知!希望可以与大家相互的交流学习&…

golang 1.25.0 安装

wget https://golang.google.cn/dl/go1.25.0.linux-amd64.tar.gz tar -C /usr/local/ -xzf go1.25.0.linux-amd64.tar.gz ln -s /usr/local/go/bin/* /usr/bin/ go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct

基于深度学习的人脸表情识别系统:YOLOv5/v6/v7/v8/v10模型实现与UI界面集成

基于YOLOv5/v7/v8的智能人脸表情识别系统:从算法原理到应用实现 表情识别的技术价值与挑战 人脸表情识别(Facial Expression Recognition, FERYOLOv5/v7/v8等深度学习算法构建高效的表情识别系统,并设计直观的UI界面集成方案。无论你是深度学习初学者还是有经验的开发者,…

初步了解多线程

系列文章目录 目录 系列文章目录 前言 一、进程 二、线程 1. 线程解决资源开销的方式 2. 线程和进程的联系和区别 三、多线程编程 1. 直观了解多线程 2. 线程的创建方式 1. 继承 Thread 重写 run() 方法 2. 实现 Runable 接口,重写 run() 方法 3. 继承 …

安卓Android低功耗蓝牙BLE连接异常报错133

安卓Android低功耗蓝牙BLE连接异常报错133 之前连接一直好好的,不知道为什么今天突然就连接不了蓝牙了,报错133,按照 找网上的说明总是说清除GATT缓存,其实并不是我的问题,最后看到这里https://softs.im/android-ble-%e8%bf%9e%e6%8e%a5%e9%94%99%e8%af%af133/ 有如下说明: 情…

【分治】快排与归并专题

分治思想 分(Divide):将待排序数组不断拆分为两个等长(或近似等长)的子数组,直到子数组长度为 1(天然有序)。 治(Conquer):递归排序每个子数组。 …

[Linux]学习笔记系列 -- mm/page_alloc

文章目录mm/page_alloc.c 伙伴系统内存分配器(Buddy System Memory Allocator) 内核物理内存管理的核心历史与背景这项技术是为了解决什么特定问题而诞生的?它的发展经历了哪些重要的里程碑或版本迭代?目前该技术的社区活跃度和主流应用情况如何&#xf…

3秒传输大文件:cpolar+Localsend实现跨网络秒传

文章目录前言1. 在Windows上安装LocalSend2. 安装Cpolar内网穿透3. 公网访问LocalSend4. 固定LocalSend公网地址用 cpolar 让 Localsend 突破距离限制就是这么简单!三步轻松搞定:在手机和电脑上都安装 Localsend,在其中一台设备上运行 cpolar…

基于STM32单片机智能RFID刷卡汽车位锁桩设计

1 系统功能介绍 本系统是一个 基于 STM32 单片机的智能 RFID 刷卡车位锁桩控制系统,其设计理念来源于现实中智能停车场的车位锁桩管理。通过 RFID 刷卡认证、LCD1602 显示、继电器控制以及按键辅助操作,实现对车位的安全管理。该系统不仅模拟了车辆驶入与…

SQL185 试卷完成数同比2020年的增长率及排名变化

描述现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间):试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交…

网络编程中的TCP——TCP的连接的建立、关闭、状态转移

网络编程中的TCP——TCP的连接的建立、关闭、状态转移 TCP连接的建立和关闭wireshark捕获数据:TCP三次握手四次挥手的时序图:三次握手: 报文段1包含SYN标志,这是一个同步报文段,表示发起连接请求,包含自己起…

SQL 语句拼接在 C 语言中的实现与安全性分析

代码解析 // 构建SQL插入语句 char *sql_insert (char *)malloc(sizeof(char) * 200); // 分配200字节内存 strcpy(sql_insert, "INSERT INTO user(username, passwd) VALUES("); // 复制基础SQL语句 strcat(sql_insert, ""); // 添加单引号 strcat(sq…

`lock()` 和 `unlock()` 线程同步函数

1) 函数的概念与用途 lock() 和 unlock() 不是特定的标准库函数,而是线程同步原语的一般概念,用于在多线程环境中保护共享资源。在不同的编程环境和库中,这些函数有不同的具体实现(如 POSIX 线程的 pthread_mutex_lock() 或 C 的 …

升级openssh后ORACLE RAC EM 安装失败处理

升级过程中由于SCP传输时目标目录/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans 不存在导致的OC4J配置失败:WARNING: /usr/bin/scp: dest open "/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans": No such file or directory/usr/bin/scp…

ADB 调试工具的学习[特殊字符]

一、ADB 的工作原理 1.1 ADB 概念 ADB (Android Debug Bridge):Android 调试桥,是开发/测试 Android 应用必备的调试工具。作用:通过 电脑终端命令 操作 安卓手机/模拟器。 1.2 ADB 构成与原理 ADB 由三部分组成: Client 端&#…

用一根“数据中枢神经”串起业务从事件流到 Apache Kafka

1. 为什么是“事件流”? 在一个软件定义、自动化、永远在线的世界里,系统之间最需要的是:把发生了什么这件事,第一时间、按正确顺序、可靠地传到该知道的人/系统那里。 事件流就像企业的中枢神经:它把数据库更新、设备…

【RAGFlow代码详解-4】数据存储层

数据库基础设施 RAGFlow 使用关系数据库(MySQL 或 PostgreSQL)作为主要元数据存储,通过具有连接池和重试机制的 Peewee ORM 进行管理。 连接管理 数据库连接通过 service_conf.yaml 和环境变量进行配置。该系统支持具有可配置连接池的 MySQL …