转换未应用于 CustomDataset Pytorch
Transform not getting applied on CustomDataset Pytorch
我的图片文件夹结构如下:
root_dir
│
└───folder1
│ │ file011.png
│ │ file012.png
│
└───folder2
| │ file021.png
| │ file022.png
|
└───folder2
│ file031.png
│ file032.png
...
现在我想在 PyTorch 中创建一个没有标签的 CustomeDataset(因为我将它用于 GAN)
所以我做了以下事情:
class CurrencyDataset(Dataset):
'''
Currency Dataset with no labels
'''
def __init__(self, type, transform):
'''
Parameters
type : "Train" or "Test"
transform : Transformations to be applied
'''
root_dir = "indian-currency-notes-classifier/"
# Storing images in a list
self.data = []
self.transform = transform
dir = os.path.join(root_dir, type)
for note in os.listdir(dir) :
note_dir = os.path.join(dir, note)
for img_name in os.listdir(note_dir):
img = io.imread(os.path.join(note_dir, img_name))
self.data.append(img)
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
x = self.data[idx]
if self.transform :
x = self.transform(x)
return x
并使用了以下转换:
transform = transforms.Compose([
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
transforms.RandomRotation(15),
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
train_ds = CurrencyDataset("Train", transform)
但是在检查张量的形状和值时,我发现没有应用转换
train_ds.data[0].shape
>> (1072, 1154, 3)
我对 PyTorch 有点陌生所以请让我知道如果我在这里做错了什么或者需要做些什么才能使其正确?
您忘记将 transform
对象指定为实例的属性。这反过来意味着 self.transform
在 __getitem__
函数中的计算结果为 None
。只需在 __init__
中添加以下内容:
self.transform = transform
此外,您没有使用 train_ds.data[0].shape
调用正确的函数 (__getitem__
),而应该是 train_ds[0]
(换句话说:train_ds.__getitem__(0)
)。
最后,您的管道没有正确的转换顺序,因为 T.Resize
期望 torch.Tensor
,而不是 PIL 图像:
transform = T.Compose([
T.RandomRotation(15),
T.Resize((224, 224)),
T.ToTensor(),
T.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])
我相信这应该是你转换的顺序。你能试试这个吗?
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.RandomRotation(15),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
])
我的图片文件夹结构如下:
root_dir
│
└───folder1
│ │ file011.png
│ │ file012.png
│
└───folder2
| │ file021.png
| │ file022.png
|
└───folder2
│ file031.png
│ file032.png
...
现在我想在 PyTorch 中创建一个没有标签的 CustomeDataset(因为我将它用于 GAN) 所以我做了以下事情:
class CurrencyDataset(Dataset):
'''
Currency Dataset with no labels
'''
def __init__(self, type, transform):
'''
Parameters
type : "Train" or "Test"
transform : Transformations to be applied
'''
root_dir = "indian-currency-notes-classifier/"
# Storing images in a list
self.data = []
self.transform = transform
dir = os.path.join(root_dir, type)
for note in os.listdir(dir) :
note_dir = os.path.join(dir, note)
for img_name in os.listdir(note_dir):
img = io.imread(os.path.join(note_dir, img_name))
self.data.append(img)
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
x = self.data[idx]
if self.transform :
x = self.transform(x)
return x
并使用了以下转换:
transform = transforms.Compose([
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
transforms.RandomRotation(15),
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
train_ds = CurrencyDataset("Train", transform)
但是在检查张量的形状和值时,我发现没有应用转换
train_ds.data[0].shape
>> (1072, 1154, 3)
我对 PyTorch 有点陌生所以请让我知道如果我在这里做错了什么或者需要做些什么才能使其正确?
您忘记将 transform
对象指定为实例的属性。这反过来意味着 self.transform
在 __getitem__
函数中的计算结果为 None
。只需在 __init__
中添加以下内容:
self.transform = transform
此外,您没有使用 train_ds.data[0].shape
调用正确的函数 (__getitem__
),而应该是 train_ds[0]
(换句话说:train_ds.__getitem__(0)
)。
最后,您的管道没有正确的转换顺序,因为 T.Resize
期望 torch.Tensor
,而不是 PIL 图像:
transform = T.Compose([
T.RandomRotation(15),
T.Resize((224, 224)),
T.ToTensor(),
T.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])
我相信这应该是你转换的顺序。你能试试这个吗?
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.RandomRotation(15),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
])