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

VGG16训练遇输入与目标batch_size不匹配错误,求解决方案

解决VGG16图像分类中Input Batch Size与Target Batch Size不匹配的问题

错误原因分析

你遇到的ValueError: Expected input batch_size (1225) to match target batch_size (25),本质是特征展平逻辑和全连接层输入维度不匹配:

  • VGG16对224×224的3通道图像,经过5个卷积块后,输出的特征图尺寸是[25, 512, 7, 7](batch_size=25,通道数512,尺寸7×7)。
  • 你用x.view(-1, 512)直接展平,会把整个张量变成[1225, 512](25×7×7=1225),完全破坏了原有的batch维度,导致全连接层输出的batch_size变成1225,和标签的25不匹配。

可行解决方案

1. 修正全连接层输入维度与特征展平方式

这是最直接的修复方式:

  • 首先修改全连接层的第一个Linear层,输入维度改为512*7*7=25088(对应VGG16标准结构的全连接层输入):
    self.classifier = nn.Sequential(
        nn.Linear(512*7*7, 4096),  # 替换原512为25088
        nn.ReLU(True),
        nn.Linear(4096, 4096),
        nn.ReLU(True),
        nn.Linear(4096, num_classes)
    )
    
  • 然后修改forward函数中的特征展平代码,保留batch维度:
    def forward(self, x):
        x = self.block_1(x)
        x = self.block_2(x)
        x = self.block_3(x)
        x = self.block_4(x)
        x = self.block_5(x)
        # 用x.size(0)保留batch维度,自动展平每个样本的特征
        logits = self.classifier(x.view(x.size(0), -1))
        probas = F.softmax(logits, dim=1)
        return logits, probas
    

2. 可选:添加自适应池化适配不同输入尺寸

如果后续可能调整输入图像尺寸,建议在卷积块后加入自适应平均池化,固定特征图尺寸为7×7,避免因输入尺寸变化再次出现维度错误:

def forward(self, x):
    x = self.block_1(x)
    x = self.block_2(x)
    x = self.block_3(x)
    x = self.block_4(x)
    x = self.block_5(x)
    # 固定特征图为7×7,适配任意输入尺寸
    x = nn.AdaptiveAvgPool2d((7,7))(x)
    logits = self.classifier(x.view(x.size(0), -1))
    probas = F.softmax(logits, dim=1)
    return logits, probas

3. 修复初始化代码的笔误

你的Linear层初始化中有重复的detach(),修正为:

elif isinstance(m, torch.nn.Linear):
    m.weight.detach().normal_(0, 0.05)
    m.bias.detach().zero_()  # 去掉多余的detach()

内容的提问来源于stack exchange,提问作者Vojtěch Kadlec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:01:00