I build a training data for a model using PyTorch:
def shufflerow(tensor1, tensor2, axis):
row_perm = torch.rand(tensor1.shape[:axis+1]).argsort(axis) # get permutation indices
for _ in range(tensor1.ndim-axis-1): row_perm.unsqueeze_(-1)
row_perm = row_perm.repeat(*[1 for _ in range(axis+1)], *(tensor1.shape[axis+1:])) # reformat this for the gather operation
return tensor1.gather(axis, row_perm),tensor2.gather(axis, row_perm)
class Dataset:
def __init__(self, observation, next_observation):
self.data =(observation, next_observation)
indices = torch.randperm(observation.shape[0])
self.train_samples = (observation[indices ,:], next_observation[indices ,:])
self.test_samples = shufflerow(observation, next_observation, 0)
I also have this function which examines whether the data converted to torch.tensor and set the device:
def to_tensor(x, device):
if torch.is_tensor(x):
return x
elif isinstance(x, np.ndarray):
return torch.from_numpy(x).to(device=device, dtype=torch.float32)
elif isinstance(x, list):
if all(isinstance(item, np.ndarray) for item in x):
return [torch.from_numpy(item).to(device=device, dtype=torch.float32) for item in x]
elif isinstance(x, tuple):
return (torch.from_numpy(item).to(device=device, dtype=torch.float32) for item in x)
else:
print(f"X:{x} and X's type{type(x)}")
return torch.tensor(x).to(device=device, dtype=torch.float32)
But passing the input data that basically looks like this through the Dataset class:
data=Dataset(s1,s2)
print(data.train_samples)
(tensor([[-0.3121, -0.9500, 1.4518],
[-0.9903, -0.1391, -4.4141],
[-0.9645, -0.2642, 5.0233],
[-0.6413, 0.7673, -4.5495],
[-0.3073, 0.9516, -1.0128],
[-0.5495, 0.8355, 3.4044],
[-0.5710, -0.8209, -3.2716],
[-0.9388, 0.3445, 3.9225],
[-0.8402, -0.5423, -4.0820]]), tensor([[-0.2723, -0.9622, 0.8342],
[-0.9958, 0.0912, -4.6186],
[-0.8747, -0.4847, 4.7741],
[-0.5495, 0.8355, 3.4044],
[-0.7146, 0.6996, 4.2841],
[-0.7128, -0.7014, -3.7148],
[-0.9915, 0.1303, 4.4200],
[-0.9358, -0.3526, -4.2585]]))
I get this error message:
-> 1725 self._target_samples = to_tensor(true_samples)
1726 self._steps = []
/content/data_gen.py in to_tensor(x)
1368 else:
1369 print(f"X:{x} and X's type{type(x)}")
-> 1370 return torch.tensor(x).to(device=device, dtype=torch.float32)
X:<generator object to_tensor.<locals>.<genexpr> at 0x7f380235d6d0> and X's type<class 'generator'>
RuntimeError: Could not infer dtype of generator
Any suggestion, why I am getting this error?
The expression (torch.from_numpy(item).to(device=device, dtype=torch.float32) for item in x)
isn't creating a tuple, it's a generator expression. Since it's in a case where you test for tuples, I suspect you wanted a tuple instead of a generator. Try:
elif isinstance(x, tuple):
return tuple(torch.from_numpy(item).to(device=device, dtype=torch.float32) for item in x)