import pandas as pd
import numpy as np
import cv2
from torch.utils.data.dataset import Dataset
class CustomDatasetFromCSV(Dataset):
def __init__(self, csv_path, transform=None):
self.data = pd.read_csv(csv_path)
self.labels = pd.get_dummies(self.data['emotion']).as_matrix()
self.height = 48
self.width = 48
self.transform = transform
def __getitem__(self, index):
pixels = self.data['pixels'].tolist()
faces = []
for pixel_sequence in pixels:
face = [int(pixel) for pixel in pixel_sequence.split(' ')]
# print(np.asarray(face).shape)
face = np.asarray(face).reshape(self.width, self.height)
face = cv2.resize(face.astype('uint8'), (self.width, self.height))
faces.append(face.astype('float32'))
faces = np.asarray(faces)
faces = np.expand_dims(faces, -1)
return faces, self.labels
def __len__(self):
return len(self.data)
这是我可以通过使用来自其他存储库的引用来做到的。 但是,我想将这个数据集分割成train和test。
我怎么能在这个班里做到?或者我需要另设一个班来做?
当前的答案会进行随机拆分,缺点是不能保证每个类的样本数是平衡的。当您希望每个类具有少量样本时,这尤其有问题。例如,MNIST有60000个示例,即每个数字6000个。假设您的训练集中每个数字只需要30个示例。在这种情况下,随机拆分可能会导致类之间的不平衡(一个数字的训练数据多于其他数字)。所以你要确保每个数字只有30个标签。这称为分层抽样。
一种方法是在Pytorch和sample code is here中使用sampler接口。
另一种方法是直接破解:)。例如,下面是MNIST的简单实现,其中
ds
是MNIST数据集,k
是每个类所需的样本数。您可以这样使用此函数:
从PyTorch 0.4.1开始,您可以使用^{} :
使用Pytorch的^{} :
相关问题 更多 >
编程相关推荐