我正在尝试使用 PyTorch 制作一个简单的图像分类器。这是我将数据加载到数据集和 dataLoader 中的方式:
batch_size = 64
validation_split = 0.2
data_dir = PROJECT_PATH+"/categorized_products"
transform = transforms.Compose([transforms.Grayscale(), CustomToTensor()])
dataset = ImageFolder(data_dir, transform=transform)
indices = list(range(len(dataset)))
train_indices = indices[:int(len(indices)*0.8)]
test_indices = indices[int(len(indices)*0.8):]
train_sampler = SubsetRandomSampler(train_indices)
test_sampler = SubsetRandomSampler(test_indices)
train_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, sampler=train_sampler, num_workers=16)
test_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, sampler=test_sampler, num_workers=16)
Run Code Online (Sandbox Code Playgroud)
我想分别打印出训练和测试数据中每个班级的图像数量,如下所示:
在火车数据中:
在测试数据中:
我试过这个:
from collections import Counter
print(dict(Counter(sample_tup[1] for sample_tup in dataset.imgs)))
Run Code Online (Sandbox Code Playgroud)
但我收到了这个错误:
AttributeError: 'MyDataset' object has no attribute 'img'
Run Code Online (Sandbox Code Playgroud) 我正在制作一个DataLoader
from DataSet
in PyTorch
。
从加载DataFrame
所有dtype作为开始np.float64
result = pd.read_csv('dummy.csv', header=0, dtype=DTYPE_CLEANED_DF)
这是我的数据集类。
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):
def __init__(self, result):
headers = list(result)
headers.remove('classes')
self.x_data = result[headers]
self.y_data = result['classes']
self.len = self.x_data.shape[0]
def __getitem__(self, index):
x = torch.tensor(self.x_data.iloc[index].values, dtype=torch.float)
y = torch.tensor(self.y_data.iloc[index], dtype=torch.float)
return (x, y)
def __len__(self):
return self.len
Run Code Online (Sandbox Code Playgroud)
准备train_loader and test_loader
train_size = int(0.5 * len(full_dataset))
test_size = len(full_dataset) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(full_dataset, [train_size, test_size]) …
Run Code Online (Sandbox Code Playgroud) 如何从PyTorch获得单个随机exmaple DataLoader
?
如果我DataLoader
给出了多个图像和标签的分页,我如何获得单个随机图像和标签?
请注意,我不希望每个小批量单个图像和标签,我想要一个例子.
我目前正在加载一个包含人工智能训练数据的文件夹。子文件夹代表标签名称以及内部相应的图像。使用 pyTorch 的 ImageFolder 加载器可以很好地实现这一点。
def load_dataset():
data_path = 'C:/example_folder/'
train_dataset_manual = torchvision.datasets.ImageFolder(
root=data_path,
transform=torchvision.transforms.ToTensor()
)
train_loader_manual = torch.utils.data.DataLoader(
train_dataset_manual,
batch_size=1,
num_workers=0,
shuffle=True
)
return train_loader_manual
full_dataset = load_dataset()
Run Code Online (Sandbox Code Playgroud)
现在我想将此数据集分为训练数据集和测试数据集。我为此使用 random_split 函数:
training_data_size = 0.8
train_size = int(training_data_size * len(full_dataset))
test_size = len(full_dataset) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(full_dataset, [train_size, test_size])
Run Code Online (Sandbox Code Playgroud)
full_dataset 是类型的对象torch.utils.data.dataloader.DataLoader
。我可以用这样的循环来迭代它:
for batch_idx, (data, target) in enumerate(full_dataset):
print(batch_idx)
Run Code Online (Sandbox Code Playgroud)
是train_dataset
类型的对象torch.utils.data.dataset.Subset
。如果我尝试循环它,我会得到:
TypeError“DataLoader”对象不可下标:
for batch_idx, (data, target) in enumerate(train_dataset):
print(batch_idx)
Run Code Online (Sandbox Code Playgroud)
我怎样才能循环它?我对 Python 比较陌生。
谢谢!
我想在 PyTorch 和 Torchvision 中加载 MNIST 数据集,将其分为训练、验证和测试部分。到目前为止,我有:
def load_dataset():
train_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST(
'/data/', train=True, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor()])),
batch_size=batch_size_train, shuffle=True)
test_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST(
'/data/', train=False, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor()])),
batch_size=batch_size_test, shuffle=True)
Run Code Online (Sandbox Code Playgroud)
如果训练数据集在DataLoader
. 我想使用训练数据集中的最后 10000 个示例作为验证数据集(我知道我应该做 CV 以获得更准确的结果,我只想在这里快速验证)。
在我的自定义数据集中,一种图像在一个文件夹中,torchvision.datasets.Imagefolder 可以处理,但如何将数据集拆分为训练和测试?