当 PyTorch 张量最初是 2 维时,将其重塑为 3 维?

Reshaping a PyTorch tensor to 3 dimensions when it is originally 2 dimensions?

我想采用我拥有的 PyTorch 张量,最初的形状为 torch.Size([15000, 23]) 并重塑它,使其与尖峰神经网络中的 运行 兼容(snnTorch 是我在 PyTorch 中使用的框架)。输入到 SNN 的张量的形状应该 [time x batch_size x feature_dimensions](更多信息可以在 here.

中找到)

现在,我正在使用以下代码:

    # Create data of dimensions [time x batch_size x feature_dimensions]
    time_steps = 200
    batch_size = 1
    feature_dimensions = torch_input_tensor.size(dim = 1)
    torch_input_tensor_reshaped = torch.reshape(torch_input_tensor, (time_steps, batch_size, feature_dimensions))
    print(torch_input_tensor_reshaped.size())
    print(torch_input_tensor_reshaped)

当我运行这段代码时,我得到以下错误:

RuntimeError: shape '[200, 1, 23]' is invalid for input of size 345000

我可能使用了错误的函数来执行此操作,但想法是我目前有 15000 个数据点和 23 个输入特征。我基本上想输入相同的数据点(23 个特征,1 个数据点)200 次(200 个时间步长)。

在link提供的例子中,使用以下代码:

spk_in = spikegen.rate_conv(torch.rand((200, 784))).unsqueeze(1)

unsqueeze函数是让dim=1的输入表示'one batch'的数据

如何使我的数据形状与 SNN 中的 运行 兼容?

SNN 的特点是它们是时变的,因此如果您的数据是时间静态的,那么您的选择是:

  1. 在每个时间步将相同的样本传递给网络,或者
  2. 在传入之前将其转换为脉冲序列。

您似乎打算选择 (2),尽管 (1) 可能更容易。

在训练期间,您会一遍又一遍地将相同的样本传递给网络:

for step in range(num_steps):
    cur1 = self.fc1(x)

如果您的输入随时间变化,则必须将 x 更改为 x[step] 以遍历每个时间步长。 An example of this with MNIST is given here.

如果以上代码没有帮助,那么查看您如何定义网络会很有用。尝试类似的东西:

# Define Network
class Net(nn.Module):
    def __init__(self):
        super().__init__()

        # Initialize layers
        self.fc1 = nn.Linear(23, 100) # 23 inputs, 100 hidden neurons
        self.lif1 = snn.Leaky(beta=0.9) # randomly chose 0.9 
        self.fc2 = nn.Linear(100, num_outputs) # change num_outputs to your number of classes
        self.lif2 = snn.Leaky(beta=0.9)

    def forward(self, x):

        # Initialize hidden states at t=0
        mem1 = self.lif1.init_leaky()
        mem2 = self.lif2.init_leaky()

        # Record the final layer
        spk2_rec = []
        mem2_rec = []

        for step in range(num_steps):
            cur1 = self.fc1(x)
            spk1, mem1 = self.lif1(cur1, mem1)
            cur2 = self.fc2(spk1)
            spk2, mem2 = self.lif2(cur2, mem2)
            spk2_rec.append(spk2)
            mem2_rec.append(mem2)

        return torch.stack(spk2_rec, dim=0), torch.stack(mem2_rec, dim=0)