PyTorch设置batch size为100时报输入与目标batch size不匹配问题
问题根因
- 卷积层输入维度不匹配:PyTorch的
nn.Conv1d要求输入张量格式为(batch_size, in_channels, sequence_length),你当前输入数据形状为(100, 32),直接送入卷积层时维度逻辑完全错位,导致后续张量的batch维度丢失,送入自定义Hybrid层时仅能处理单样本。 - Hybrid量子层无批处理逻辑:你当前使用的Qiskit自定义Hybrid层默认只支持单样本输入,不管输入多少个样本,最终仅输出单样本结果
(1, 2),和你的batch size=100不匹配。
修复步骤
1. 调整卷积层输入格式与参数
首先修正维度适配问题:
- 若你的单样本特征长度为32、通道数为1,将
__init__中的卷积层定义修改为nn.Conv1d(1, 1, kernel_size=1),并在forward函数最开头扩展输入的通道维度:
def forward(self, x): # 新增维度扩展,将形状从(100, 32)转为符合Conv1d要求的(100, 1, 32) x = x.unsqueeze(1) x = F.relu(self.conv1(x)) x = self.dropout(x) x = x.view(x.size(0), -1) x = F.relu(self.fc1(x)) x = self.fc2(x) # 此时x形状为(100, 1),送入Hybrid层 x = self.hybrid(x) return torch.cat((x, 1 - x), -1)
若你的单样本通道数为32、特征长度为1,自行调整卷积层参数为nn.Conv1d(32, 1, kernel_size=1),对应扩展维度方式改为x = x.unsqueeze(-1)即可。
2. 修改Hybrid层支持批处理
在Hybrid层的forward逻辑中增加批处理循环,逐个处理batch内的样本后再拼接输出:
def forward(self, x): # 输入x形状为(batch_size, 1) batch_out = [] for single_sample in x: # 保留原有单样本量子计算逻辑,输出单个样本的计算结果 single_res = 原有单样本处理逻辑(single_sample) batch_out.append(single_res) # 拼接后输出形状为(batch_size, 1),匹配后续拼接要求 return torch.tensor(batch_out, device=x.device)
修改后网络最终输出形状为(100, 2),和标签的batch size完全匹配,报错即可解决。
内容的提问来源于stack exchange,提问作者user14924
相关产品推荐
相关产品推荐

