You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求助:如何用Equiformer模型训练原子坐标数据的得分函数?

极简Equiformer训练脚本(适配原子坐标+独热原子类型)

问题解决说明

你遇到的「维度必须为2」报错,核心原因是直接传入了单样本的N×118独热特征,而Equiformer要求输入特征带批次维度(即(batch_size, num_atoms, feat_dim));同时高维独热特征直接作为输入也易引发维度兼容问题。下面是适配你的数据的极简训练脚本,包含独热特征的嵌入处理:

完整训练脚本

import torch
import torch.nn as nn
from equiformer_pytorch import Equiformer

# 1. 定义模型:先将独热原子特征嵌入到低维,再传入Equiformer
class ScoreModel(nn.Module):
    def __init__(self, num_elements=118, embed_dim=64):
        super().__init__()
        # 独热特征嵌入层:N×118 → N×64
        self.atom_embedding = nn.Linear(num_elements, embed_dim)
        # 初始化Equiformer:输入特征维度为embed_dim,输出为单得分值
        self.equiformer = Equiformer(
            dim=embed_dim,
            dim_head=32,
            heads=4,
            num_layers=3,
            num_degrees=4,
            attend_self=True,
            reduce_dim_out=True,
            out_dim=1  # 输出标量得分
        )

    def forward(self, coords, atom_one_hot):
        # 处理原子特征:独热编码转低维嵌入
        atom_feats = self.atom_embedding(atom_one_hot)  # shape: (B, N, embed_dim)
        # Equiformer前向传播:coords为(B, N, 3),feats为(B, N, embed_dim)
        score = self.equiformer(coords, feats=atom_feats)
        return score.squeeze()  # 压缩维度为(B,)

# 2. 模拟训练数据(批次大小为2,每个样本含10个原子)
# 实际训练中需用DataLoader处理可变原子数,此处用固定长度简化
batch_coords = torch.randn(2, 10, 3)  # (batch_size, num_atoms, 3)
batch_one_hot = torch.zeros(2, 10, 118)
# 随机分配原子类型
for b in range(2):
    for n in range(10):
        elem_idx = torch.randint(0, 118, (1,))
        batch_one_hot[b, n, elem_idx] = 1.0

# 3. 初始化模型与优化器
model = ScoreModel()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

# 4. 按要求定义空逻辑损失函数
def dummy_loss(pred_score, target):
    return torch.tensor(0.0, requires_grad=True)

# 5. 训练循环示例
model.train()
for epoch in range(10):
    optimizer.zero_grad()
    # 前向传播
    pred_scores = model(batch_coords, batch_one_hot)
    # 模拟目标得分(实际训练替换为真实标签)
    target_scores = torch.randn(2)
    # 计算损失
    loss = dummy_loss(pred_scores, target_scores)
    # 反向传播与参数更新
    loss.backward()
    optimizer.step()
    print(f"Epoch {epoch+1}, Loss: {loss.item()}")

关键注意点

  • 独热特征处理:通过nn.Linear将118维独热编码转换为低维嵌入,既解决维度兼容问题,也提升模型训练效率
  • 批次维度:所有输入(坐标、原子特征)必须包含批次维度(batch_size, num_atoms, ...),这是你之前报错的核心原因
  • 可变原子数:实际训练中若每个样本原子数量不同,需用torch.nn.utils.rnn.pad_sequence或自定义DataLoader做padding处理

内容的提问来源于stack exchange,提问作者Connor Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:52:42