如何将2维PyTorch张量调整为3维以适配snnTorch脉冲神经网络输入
报错原因
torch.reshape仅调整张量元素的排列方式,不会新增或减少元素,要求目标形状的总元素数和原张量完全一致。你的原张量总元素数为15000 * 23 = 345000,而指定的目标形状[200, 1, 23]总元素数仅为200 * 1 * 23 = 4600,二者不匹配因此触发报错。- 你的需求是将单个样本重复200次作为时间步输入,本质是生成新的重复元素,无法通过
reshape实现,需要用张量复制类操作。
适配snnTorch输入格式的解决方法
根据你的使用场景选择对应代码即可:
场景1:一次性输入全部15000个样本(batch_size=15000,批量处理性能最优)
输出形状为标准的[time_steps, batch_size, feature_dimensions]即[200, 15000, 23],符合snnTorch输入要求:
time_steps = 200 # 第一步:在原张量最前方插入时间步维度,形状从[15000,23]变为[1,15000,23] temp_tensor = torch_input_tensor.unsqueeze(0) # 第二步:将时间步维度重复200次,其余维度保持不变 torch_input_tensor_reshaped = temp_tensor.repeat(time_steps, 1, 1) # 验证输出形状 print(torch_input_tensor_reshaped.shape)
场景2:逐个输入样本(batch_size=1,和你原代码的batch设置一致)
如果需要单次仅处理1个样本,单样本处理代码如下,输出形状为[200, 1, 23]:
time_steps = 200 batch_size = 1 # 以处理第0个样本为例,遍历所有样本时修改索引即可 single_sample = torch_input_tensor[0] # 依次插入时间步、batch维度后,重复时间步200次 snn_input = single_sample.unsqueeze(0).unsqueeze(0).repeat(time_steps, batch_size, 1) # 验证输出形状 print(snn_input.shape)
补充:生成脉冲序列输入
如果你需要将输入转为脉冲序列而非直接重复模拟值,可以直接调用snnTorch的spikegen工具,示例如下:
from snntorch import spikegen # 单样本脉冲生成示例 single_sample = torch_input_tensor[0] # 生成200时间步的脉冲序列,形状为[200,23] spk_in = spikegen.rate_conv(single_sample.repeat(time_steps, 1)) # 插入batch维度,最终形状为[200,1,23] spk_in = spk_in.unsqueeze(1)
内容的提问来源于stack exchange,提问作者user10335564
相关产品推荐
相关产品推荐

