I implemented this cord. But error occurred about the size of tensor .
Where should I fix it and what does it mean this error ?
Could someone teach me? please
error message
Traceback (most recent call last):
File "C:/Users/name/Desktop/myo-python-1.0.4/bindsnet-master/bindsnet/nextrsnn.py", line 88, in <module>
network.run(inputs=inputs, time=time)
File "C:\Python36\lib\site-packages\bindsnet\network\network.py", line 357, in run
self.layers[l].forward(x=current_inputs[l])
File "C:\Python36\lib\site-packages\bindsnet\network\nodes.py", line 220, in forward
super().forward(x)
File "C:\Python36\lib\site-packages\bindsnet\network\nodes.py", line 108, in forward
self.summed += x.float()
RuntimeError: The size of tensor a (64) must match the size of tensor b (384) at non-singleton dimension 1
cord
import torch
import torch.nn as nn
import numpy as np
from bindsnet.network import Network
from bindsnet.network.nodes import Input, LIFNodes
from bindsnet.network.topology import Connection
from bindsnet.network.monitors import Monitor
# define model
class LogisticRegression(nn.Module):
def __init__(self, input_size, num_classes):
super(LogisticRegression, self).__init__()
self.linear = nn.Linear(input_size, num_classes)
self.dropout = nn.Dropout(0.5)
def forward(self, x):
output = self.linear(x)
return output
# building network
input_size = 64
num_classes = 6
time = 300
network = Network(dt=1.0)
_BATCH_SIZE = 300
# building 5 layers
inpt = Input(n=64, sum_input=True)
middle = LIFNodes(n=40, trace=True, sum_input=True)
center = LIFNodes(n=40, trace=True, sum_input=True)
final = LIFNodes(n=40, trace=True, sum_input=True)
out = LIFNodes(n=6, sum_input=True)
# connecting each layers
inpt_middle = Connection(source=inpt, target=middle, wmin=0, wmax=1e-1)
middle_center = Connection(source=middle, target=center, wmin=0, wmax=1e-1)
center_final = Connection(source=center, target=final, wmin=0, wmax=1e-1)
final_out = Connection(source=final, target=out, wmin=0, wmax=1e-1)
# connecting all layers to network
network.add_layer(inpt, name='A')
network.add_layer(middle, name='B')
network.add_layer(center, name='C')
network.add_layer(final, name='D')
network.add_layer(out, name='E')
forward_connection = Connection(source=inpt, target=middle, w=0.05 + 0.1*torch.randn(inpt.n, middle.n))
network.add_connection(connection=forward_connection, source="A", target="B")
forward_connection = Connection(source=middle, target=center, w=0.05 + 0.1*torch.randn(middle.n, center.n))
network.add_connection(connection=forward_connection, source="B", target="C")
forward_connection = Connection(source=center, target=final, w=0.05 + 0.1*torch.randn(center.n, final.n))
network.add_connection(connection=forward_connection, source="C", target="D")
forward_connection = Connection(source=final, target=out, w=0.05 + 0.1*torch.randn(final.n, out.n))
network.add_connection(connection=forward_connection, source="D", target="E")
recurrent_connection = Connection(source=out, target=out, w=0.025*(torch.eye(out.n)-1),)
network.add_connection(connection=recurrent_connection, source="E", target="E")
# define of monitor as layers
inpt_monitor = Monitor(obj=inpt, state_vars=("s", "v"), time=500,)
middle_monitor = Monitor(obj=inpt, state_vars=("s", "v"), time=500,)
center_monitor = Monitor(obj=inpt, state_vars=("s", "v"), time=500,)
final_monitor = Monitor(obj=inpt, state_vars=("s", "v"), time=500,)
out_monitor = Monitor(obj=inpt, state_vars=("s", "v"), time=500,)
# connecting monitor to network
network.add_monitor(monitor=inpt_monitor, name="A")
network.add_monitor(monitor=middle_monitor, name="B")
network.add_monitor(monitor=center_monitor, name="C")
network.add_monitor(monitor=final_monitor, name="D")
network.add_monitor(monitor=out_monitor, name="E")
for l in network.layers:
m = Monitor(network.layers[l], state_vars=['s'], time=time)
network.add_monitor(m, name=l)
# loading data x = shape[1,64] y = [1,6]
npzfile = np.load("C:/Users/name/Desktop/myo-python-1.0.4/myo-armband-nn-master/data/train_set.npz")
x = npzfile['x']
y = npzfile['y']
# converting to tensor
x = torch.from_numpy(x).float()
y = torch.from_numpy(y).float()
training_pairs = []
for i, (x, y) in enumerate(zip(x.view(-1, 64), y)):
inputs = {'A': x.repeat(time, 6), 'E_b': torch.ones(time, 1)}
network.run(inputs=inputs, time=time)
training_pairs.append([network.monitors['E'].get('s').sum(-1), y])
network.reset_state_variables()
if (i + 1) % 50 == 0: print('Train progress: (%d / 500)' % (i + 1))
if (i + 1) == 500: print(); break
model = LogisticRegression(input_size, num_classes); criterion = nn.CrossEntropyLoss() # m2ć«ēøå½
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
# training for spikes and label
for epoch in range(6):
for i, (s, y) in enumerate(training_pairs):
optimizer.zero_grad(); output = model(s.float())
loss = criterion(output.unsqueeze(0), y.unsqueeze(0).long())
loss.backward(); optimizer.step()
test_pairs = []
for i, (x, y) in enumerate(zip(x.view(-1, 64), y)):
network.run(inpts={'A': x}, time=time)
test_pairs.append([network.monitors['E'].get('s').sum(-1), y])
network.reset_state_variables()
if (i + 1) % 50 == 0: print('Test progress: (%d / 500)' % (i + 1))
if (i + 1) == 500: print(); break
correct, total = 0, 0
for s, y in test_pairs:
output = model(s); _, predicted = torch.max(output.data.unsueeze(0), 1)
total += 1; correct += int(predicted == y.long())
print('Accuracy of logistic regression on 500 test examples: %2f %%\n ' % (100 * correct / total))
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': loss,
}, "C:/Users/name/Desktop/myo-python-1.0.4/bindsnet-master/bindsnet/pytorchsession")