①一行代表一个数据,可以是普通列表或者是np.array的形式,下面例子中x_train和x_test就是这样,分别代表着训练集和测试集,按照下边这个转换就可以啦
注意 要是分类问题,标签必须是torch.int64类型
也可以将标签和样本放到一起,每一行类似这样的([2,3,4],0),标签为0,[2,3,4]为样本特征;然后在迭代时,一行就直接可以取出样本特征和它的标签
train_x = torch.tensor(x_train,dtype=torch.float32)
train_y = torch.tensor(y_train,dtype=torch.int64)
test_x = torch.tensor(x_test,dtype=torch.float32)
test_y = torch.tensor(y_test,dtype=torch.int64)
①先导入数据
img_data = torchvision.datasets.ImageFolder(file_name,
transform=transforms.Compose([
transforms.Scale(512),
transforms.CenterCrop(512),
transforms.ToTensor()])
)
dataloader = DataLoader(img_data, batch_size=50)
torchvision.datasets.ImageFolder这个函数(非常适合用文件夹来分类的数据集),是根据文件夹进行导入数据,它给file_name下的每个文件夹默认分一个类(类别标签从0开始,有k个文件夹就有k个类,类别的最大号就是k-1),一个文件夹代表一个类,然后根据transform的条件将数据进行转换,导入的数据就类似这样的([[2,3,4],[1,2,3]],1),也是一行代表一个样本,0的位置是样本特征,1的位置是样本标签;
所以img_data的样本的个数就是file_name下所有的文件夹里的文件个数之和。
DataLoader函数进行的就是,将整个数据集划分批数,batch_size参数代表一批有多少个样本,也可用shuffle参数进行随机打乱,当数据集参数量比较大时,模型训练时使用小批量样本或随机样本(一批就1个样本),然后在训练样本时,就直接可以把dataloader放入循环,一批一批的取数据进行训练
②另一种方法
自己改写一个读取数据的类
class MyData(Dataset):
def __init__(self,imag_path,labels,transform):
self.imag_path = imag_path
self.imag_path_list = os.listdir(imag_path)
self.labels = labels
self.transform = transform
def __getitem__(self, item):
imag_name = self.imag_path_list[item]
imag_item_path = os.path.join(self.imag_path,imag_name)
img = Image.open(imag_item_path)
img = self.transform(img) #将图片类型进行转换
label = self.labels[item]-1
return img,label # 返回的第item项的图片以及对应的标签
def __len__(self):
return len(self.imag_path_list)
注意:
pytorch下读取图片都是先用Image模块读取,然后直接用transform将其变为tensor类型,如果是numpy类型会比较麻烦(本人在处理时遇到了,能烦死,一直报错,最后屈服于它;可能是我弄的有问题,大家如果可以实现,请教一下我怎么整)
#all_data产生的是(data,label)的元组,
all_data = MyData(file_name,all_labels,transform=transform)
dataloader_try = DataLoader(all_data, batch_size=50,shuffle=True) #是一个迭代器,共162个批次
all_data就和上边那个img_data中数据展现形式一致,一行一个样本以及他的标签,下边那个函数就和上边一样啦!
注意:
pytorch下的数据可都得是tensor类型哦!(初学者极易入坑)
不懂的,咱们一起评论区交流哦