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

RuntimeError求助:batch2张量前两维尺寸与预期不符

运行时错误排查:维度不匹配问题

错误描述

运行时错误:预期batch2张量的前两个维度尺寸为[128, 1024],实际得到[128, 3072]。
Error I'm getting

错误原因分析

这个维度不匹配问题核心是模型结构与输入数据的维度不兼容,具体可能的触发点:

  • 模型某层(如线性层)的输入维度定义错误:比如你把某层的输入维度设为1024,但实际传入该层的特征维度是3072,导致维度校验失败。
  • 数据预处理不一致:训练/验证数据的特征维度和模型预期输入不匹配,比如将3通道图像(展开后总维度3072)输入到了仅支持单通道(1024维度)的模型中。
  • 模型输出与损失函数不兼容:F.cross_entropy要求输入的logits形状为[batch_size, num_classes],若模型输出维度不符合,也可能触发连锁的维度校验错误。

解决方法

1. 检查并修正模型结构

  • 定位报错的模型层:根据错误提示的batch2,找到模型中对应的第二层(或第二个批量处理相关层),确认其输入维度设置。如果输入特征是3072维度,对应线性层应定义为nn.Linear(3072, ...)而非nn.Linear(1024, ...)。
  • 打印层输出维度:在模型的forward方法中,每层输出后添加print(x.shape),运行一次前向传播,快速定位维度不匹配的位置。

2. 统一数据预处理流程

  • 确认训练/验证集的特征维度一致:检查train_loader和valid_loader的预处理步骤,比如图像是否被正确转为单通道/保持三通道,特征是否被正确展开到对应维度。
  • 打印输入特征形状:在训练循环中添加print(features.shape),确认输入到模型的特征维度是否与模型输入层匹配。

3. 验证模型输出与损失函数兼容性

  • 确认模型返回的logits形状为[batch_size, num_classes],F.cross_entropy会自动适配该形状的输入。若输出维度不符,调整模型最后一层的输出维度即可。

你提供的训练代码

def compute_acc(model, data_loader, device):
    correct_pred, num_examples = 0, 0
    for features, targets in data_loader:
        features = features.to(device)
        targets = targets.to(device)
        logits, probas = model(features)
        _, predicted_labels = torch.max(probas, 1)
        num_examples += targets.size(0)
        correct_pred += (predicted_labels == targets).sum()
    return correct_pred.float()/num_examples * 100

start_time = time.time()

cost_list = []
train_acc_list, valid_acc_list = [], []

for epoch in range(NUM_EPOCHS):
    model.train()
    for batch_idx, (features, targets) in enumerate(train_loader):
        
        features = features.to(device)
        targets = targets.to(device)
            
        ### FORWARD AND BACK PROP
        logits, probas = model(features)
        cost = F.cross_entropy(logits, targets)
        optimizer.zero_grad()
        
        cost.backward()
        
        ### UPDATE MODEL PARAMETERS
        optimizer.step()
        
        #################################################
        ### CODE ONLY FOR LOGGING BEYOND THIS POINT
        ################################################
        cost_list.append(cost.item())
        if not batch_idx % 150:
            print (f'Epoch: {epoch+1:03d}/{NUM_EPOCHS:03d} | '
                   f'Batch {batch_idx:03d}/{len(train_loader):03d} |' 
                   f' Cost: {cost:.4f}')

    model.eval()
    with torch.set_grad_enabled(False): # save memory during inference
        
        train_acc = compute_acc(model, train_loader, device=device)
        valid_acc = compute_acc(model, valid_loader, device=device)
        
        print(f'Epoch: {epoch+1:03d}/{NUM_EPOCHS:03d}\n'
              f'Train ACC: {train_acc:.2f} | Validation ACC: {valid_acc:.2f}')
        
        train_acc_list.append(train_acc)
        valid_acc_list.append(valid_acc)
    
    elapsed = (time.time() - start_time)/60
    print(f'Time elapsed: {elapsed:.2f} min')

elapsed = (time.time() - start_time)/60
print(f'Total Training Time: {elapsed:.2f} min')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:05:39