0

I tried my best to make a minimal reproducible example: there's an issue in my train() function where on the line output = model(data); I get the error IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1). I also get an error before that but I cannot decipher the meaning. I've included the full traceback in this message.

I've seen other users post about the same error message, but each one has a different solution; I used the debugger to look into data.location but I'm still unable to resolve the problem. I'm using PySyft v0.2.9.

import torch
import syft as sy
import pandas as pd
from torch.utils.data import Dataset, DataLoader
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from auto_esn.esn.esn import ESNBase
import torch.nn.functional as F
import torch.optim as optim
from auto_esn.esn.esn import GroupedDeepESN
from auto_esn.esn.reservoir.util import NRMSELoss

class CarHackingDataset(Dataset):
    """
    Loading the Car-Hacking Dataset from
    https://ocslab.hksecurity.net/Datasets/car-hacking-dataset 

    Args:
        csv_file: A path to the dataset file which has the extension CSV.
        root_dir: The directory of the parent folder of the dataset.
        transform (callable, optional): Optional tansform to be applied on a sample.
    """
    def __init__(self, csv_file: str, root_dir: str, transform=None):
        self.car_hacking_frame = pd.read_csv(csv_file)[:10000]
        self.root_dir = root_dir
        self.transform = transform

    def __getitem__(self,idx):
        '''Grabs relevant features from the dataset.'''
        if torch.is_tensor(idx):
            idx = idx.tolist()

        features = ['Timestamp', 'DLC', 'CAN_ID', 'Data']
        X_train = self.car_hacking_frame.loc[:, features].values
        X_train_scaled = StandardScaler().fit_transform(X_train)
        X_train_scaled = torch.as_tensor(X_train_scaled)

        # It looks like it's a bad idea to encode features.
        # https://stackoverflow.com/questions/61217713/labelencoder-for-categorical-features

        class_le = LabelEncoder()
        target = class_le.fit_transform(self.car_hacking_frame['Flag'].values)
        target = torch.as_tensor(target)

        return X_train_scaled[idx], target[idx]
            
    def __len__(self):
        return len(self.car_hacking_frame)
train_dataset = CarHackingDataset(csv_file='/content/car_hacking_data/clean_fuzzy_dataset.csv', 
                                  root_dir='/content/car_hacking_data')

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

hook = sy.TorchHook(torch)

car1 = sy.VirtualWorker(hook, id="car1")
car2 = sy.VirtualWorker(hook, id="car2")

args = {
    'batch_size' : 32,
    'epochs' : 1
}

federated_train_loader = sy.FederatedDataLoader(train_dataset.federate((car1, car2)),
                                                batch_size=args['batch_size'], shuffle=True)

# Intializing the loss function which is probably a variation of mean squared error.
nrmse = NRMSELoss()
def train(model, device, federated_train_loader, optimizer, epoch):
    model.train()

    for batch_idx, (data, target) in enumerate(federated_train_loader):
        model = model.send(data.location)

        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)

        loss = nrmse(output, target)
        loss.backward()
        optimizer.step()
        model.get()

        if batch_idx % 10 == 0:
            loss = loss.get()

            print(f'''Train Epoch: {epoch} [{(batch_idx * args['batch_size'])}/{(len(federated_train_loader) * args['batch_size'])}'''
                   + f'''({100. * batch_idx / len(federated_train_loader):.0f}%)]\tLoss: {loss.item():.6f}''')

model = GroupedDeepESN().to(device)
optimizer = optim.SGD(model.parameters(), lr=0.01)

for epoch in range(1, args['batch_size'] + 1):
    train(model, device, federated_train_loader, optimizer, epoch)

Traceback of the error message:

---------------------------------------------------------------------------
PureFrameworkTensorFoundError             Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/syft/frameworks/torch/tensors/interpreters/native.py in handle_func_command(cls, command)
    336             new_args, new_kwargs, new_type, args_type = hook_args.unwrap_args_from_function(
--> 337                 cmd, args_, kwargs_, return_args_type=True
    338             )

20 frames
/usr/local/lib/python3.7/dist-packages/syft/generic/frameworks/hook/hook_args.py in unwrap_args_from_function(attr, args_, kwargs_, return_args_type)
    166         # Run it
--> 167         new_args = args_hook_function(args_)
    168 

/usr/local/lib/python3.7/dist-packages/syft/generic/frameworks/hook/hook_args.py in <lambda>(x)
    355 
--> 356     return lambda x: f(lambdas, x)
    357 

/usr/local/lib/python3.7/dist-packages/syft/generic/frameworks/hook/hook_args.py in three_fold(lambdas, args_, **kwargs)
    534         lambdas[0](args_[0], **kwargs),
--> 535         lambdas[1](args_[1], **kwargs),
    536         lambdas[2](args_[2], **kwargs),

/usr/local/lib/python3.7/dist-packages/syft/generic/frameworks/hook/hook_args.py in <lambda>(i)
    330         # Last if not, rule is probably == 1 so use type to return the right transformation.
--> 331         else lambda i: forward_func[type(i)](i)
    332         for a, r in zip(args_, rules)  # And do this for all the args / rules provided

/usr/local/lib/python3.7/dist-packages/syft/frameworks/torch/hook/hook_args.py in <lambda>(i)
     23     if hasattr(i, "child")
---> 24     else (_ for _ in ()).throw(PureFrameworkTensorFoundError),
     25     torch.nn.Parameter: lambda i: i.child

/usr/local/lib/python3.7/dist-packages/syft/frameworks/torch/hook/hook_args.py in <genexpr>(.0)
     23     if hasattr(i, "child")
---> 24     else (_ for _ in ()).throw(PureFrameworkTensorFoundError),
     25     torch.nn.Parameter: lambda i: i.child

PureFrameworkTensorFoundError: 

During handling of the above exception, another exception occurred:

IndexError                                Traceback (most recent call last)
<ipython-input-6-c9ac87b98598> in <module>
     24 
     25 for epoch in range(1, args['batch_size'] + 1):
---> 26     train(model, device, federated_train_loader, optimizer, epoch)

<ipython-input-6-c9ac87b98598> in train(model, device, federated_train_loader, optimizer, epoch)
      7         data, target = data.to(device), target.to(device)
      8         optimizer.zero_grad()
----> 9         output = model(data)
     10 
     11         loss = nrmse(output, target)

/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    530             result = self._slow_forward(*input, **kwargs)
    531         else:
--> 532             result = self.forward(*input, **kwargs)
    533         for hook in self._forward_hooks.values():
    534             hook_result = hook(self, input, result)

/usr/local/lib/python3.7/dist-packages/auto_esn/esn/esn.py in forward(self, input)
     31         mapped_input = self.reservoir(input)
     32 
---> 33         return self.readout(mapped_input)
     34 
     35     def reset_hidden(self):

/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    530             result = self._slow_forward(*input, **kwargs)
    531         else:
--> 532             result = self.forward(*input, **kwargs)
    533         for hook in self._forward_hooks.values():
    534             hook_result = hook(self, input, result)

/usr/local/lib/python3.7/dist-packages/auto_esn/esn/readout/svr_readout.py in forward(self, input)
     10 
     11     def forward(self, input: Tensor) -> Tensor:
---> 12         return self.readout(input)
     13 
     14     def fit(self, input: Tensor, target: Tensor):

/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    530             result = self._slow_forward(*input, **kwargs)
    531         else:
--> 532             result = self.forward(*input, **kwargs)
    533         for hook in self._forward_hooks.values():
    534             hook_result = hook(self, input, result)

/usr/local/lib/python3.7/dist-packages/torch/nn/modules/linear.py in forward(self, input)
     85 
     86     def forward(self, input):
---> 87         return F.linear(input, self.weight, self.bias)
     88 
     89     def extra_repr(self):

/usr/local/lib/python3.7/dist-packages/syft/generic/frameworks/hook/hook.py in overloaded_func(*args, **kwargs)
    333                 handle_func_command = syft.framework.Tensor.handle_func_command
    334 
--> 335             response = handle_func_command(command)
    336 
    337             return response

/usr/local/lib/python3.7/dist-packages/syft/frameworks/torch/tensors/interpreters/native.py in handle_func_command(cls, command)
    378             # in the execute_command function
    379             try:
--> 380                 response = cls._get_response(cmd, args_, kwargs_)
    381             except AttributeError:
    382                 # Change the library path to avoid errors on layers like AvgPooling

/usr/local/lib/python3.7/dist-packages/syft/frameworks/torch/tensors/interpreters/native.py in _get_response(cmd, args_, kwargs_)
    412 
    413         if isinstance(args_, tuple):
--> 414             response = command_method(*args_, **kwargs_)
    415         else:
    416             response = command_method(args_, **kwargs_)

/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in linear(input, weight, bias)
   1368     if input.dim() == 2 and bias is not None:
   1369         # fused op is marginally faster
-> 1370         ret = torch.addmm(bias, input, weight.t())
   1371     else:
   1372         output = input.matmul(weight.t())

/usr/local/lib/python3.7/dist-packages/syft/generic/frameworks/hook/hook.py in overloaded_func(*args, **kwargs)
    333                 handle_func_command = syft.framework.Tensor.handle_func_command
    334 
--> 335             response = handle_func_command(command)
    336 
    337             return response

/usr/local/lib/python3.7/dist-packages/syft/frameworks/torch/tensors/interpreters/native.py in handle_func_command(cls, command)
    378             # in the execute_command function
    379             try:
--> 380                 response = cls._get_response(cmd, args_, kwargs_)
    381             except AttributeError:
    382                 # Change the library path to avoid errors on layers like AvgPooling

/usr/local/lib/python3.7/dist-packages/syft/frameworks/torch/tensors/interpreters/native.py in _get_response(cmd, args_, kwargs_)
    412 
    413         if isinstance(args_, tuple):
--> 414             response = command_method(*args_, **kwargs_)
    415         else:
    416             response = command_method(args_, **kwargs_)

IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

I thought it might also be important to include the shape of my data inside the train function's loop over the federated data: Data shape: torch.Size([32, 4]), Target shape: torch.Size([32]).

S. Coughing
  • 176
  • 1
  • 11

0 Answers0