当 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 的特点是它们是时变的,因此如果您的数据是时间静态的,那么您的选择是:
- 在每个时间步将相同的样本传递给网络,或者
- 在传入之前将其转换为脉冲序列。
您似乎打算选择 (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)
我想采用我拥有的 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 的特点是它们是时变的,因此如果您的数据是时间静态的,那么您的选择是:
- 在每个时间步将相同的样本传递给网络,或者
- 在传入之前将其转换为脉冲序列。
您似乎打算选择 (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)