Hi everyone!
I’ve got an error “TypeError: batch must contain tensors, numbers, dicts or lists; found object” and I don’t know what’s wrong.
Checked another similar topics, but still confused.
#My Dataset class:
class GridDataset(Dataset):
“”“Grids dataset.”""
def __init__(self, csv_file, csv_file_labels, transform=None):
'''
Args:
csv_file (string): Path to the .csv file which contains pd.DataFrames in 1D.
csv_file_labels (string): Path to the .csv file which contains labels of grids.
transform (callable, optional): Optional transform to be applied on a sample.
'''
self.data_set = pd.read_csv(csv_file)
self.label = pd.read_csv(csv_file_labels)
self.transform = transform
def __len__(self):
return len(self.data_set.columns) #returns the size of the dataset (nomber of columnss)
def __getitem__(self, idx):
grid = self.data_set.iloc[:, idx].values
grid = grid.reshape(1, -1)
grid_name = self.data_set.columns[idx]
label = self.label.iloc[:, idx].values
if self.transform:
grid = self.transform(grid)
return grid, grid_name, label
#Transform classes:
#https://pytorch.org/tutorials/beginner/data_loading_tutorial.html
import pandas as pd
import numpy as np
class RescaleTo3D(object):
“”"Rescale the grid to a given size.
Args:
i_max - dimension in X
j_max - dimension in Y
k_max - dimension in Z
Return:
ThreeDim - 3d np.array
"""
def __init__(self, i_max, j_max, k_max):
self.i_max = i_max
self.j_max = j_max
self.k_max = k_max
def __call__(self, sample):
Three_Dim = np.array(np.zeros((self.i_max, self.j_max, self.k_max)))
i = 0
j = 0
k = 0
z = 0
while k <= self.k_max-1:
while j <= self.j_max-1:
while i <= self.i_max-1:
Three_Dim[i, j ,k] = sample[:,z]
i += 1
z += 1
i = 0
j += 1
j = 0
k += 1
return (Three_Dim)
class ToTensor(object):
“”“Convert ndarrays in sample to Tensors.”""
def __call__(self, sample):
return (torch.from_numpy(sample))
#After that I try this. And it works fine:
scale = RescaleTo3D(24, 18, 15)
totensor = ToTensor()
composed = transforms.Compose([scale, totensor])
for i, tsfrm in enumerate([composed]):
grid3D = tsfrm(grid)
print (grid3D) #ok
print(grid_name) #ok
print(grid3D.shape) #ok
#In this code I have problems:
path = “…/DATA/_PERMX.csv” #path to dataset
path_labels = “…/DATA/_PERMX_labels.csv” #path to dataset labels
transformed_dataset = GridDataset(path,
path_labels,
transform=transforms.Compose([RescaleTo3D(24, 18, 15),
ToTensor()
])
)
dataloader = DataLoader(dataset=transformed_dataset, batch_size=2, shuffle=True)
for batch_idx, (grid3D, grid_name, label) in enumerate(dataloader):
print(batch_idx) #no luck
Please help!
Thanks a lot in advance!
Gleb