Eu conheci um problema!
Recentemente eu encontro um problema de e/S do problema. O destino e os dados de entrada são armazenados com h5py arquivos. Cada arquivo de destino é de 2,6 GB , enquanto cada arquivo de entrada é de 10.2 GB. Eu tenho 5 conjuntos de dados de entrada e 5 conjuntos de dados de destino no total.
Eu criei um dataset personalizada função para cada h5py arquivo e, em seguida, usar de dados.ConcatDataset classe para ligação de todos os conjuntos de dados. O dataset personalizada função é:
class MydataSet(Dataset):
def __init__(self, indx=1, root_path='./xxx', tar_size=128, data_aug=True, train=True):
self.train = train
if self.train:
self.in_file = pth.join(root_path, 'train', 'train_noisy_%d.h5' % indx)
self.tar_file = pth.join(root_path, 'train', 'train_clean_%d.h5' % indx)
else:
self.in_file = pth.join(root_path, 'test', 'test_noisy.h5')
self.tar_file = pth.join(root_path, 'test', 'test_clean.h5')
self.h5f_n = h5py.File(self.in_file, 'r', driver='core')
self.h5f_c = h5py.File(self.tar_file, 'r')
self.keys_n = list(self.h5f_n.keys())
self.keys_c = list(self.h5f_c.keys())
# h5f_n.close()
# h5f_c.close()
self.tar_size = tar_size
self.data_aug = data_aug
def __len__(self):
return len(self.keys_n)
def __del__(self):
self.h5f_n.close()
self.h5f_c.close()
def __getitem__(self, index):
keyn = self.keys_n[index]
keyc = self.keys_c[index]
datan = np.array(self.h5f_n[keyn])
datac = np.array(self.h5f_c[keyc])
datan_tensor = torch.from_numpy(datan).unsqueeze(0)
datac_tensor = torch.from_numpy(datac)
if self.data_aug and np.random.randint(2, size=1)[0] == 1: # horizontal flip
datan_tensor = torch.flip(datan_tensor,dims=[2]) # c h w
datac_tensor = torch.flip(datac_tensor,dims=[2])
Então eu uso dataset_train = data.ConcatDataset([MydataSet(indx=index, train=True) for index in range(1, 6)])
para a formação. Quando apenas 2-3 h5py arquivos são utilizados, a velocidade de e/S é normal e tudo vai dá certo. No entanto, quando 5 arquivos são usados, o treinamento de velocidade vai diminuindo gradualmente (5 iterações/s para 1 iterações/s). Eu alterar o num_worker e o problema ainda existe.
Alguém poderia me dar uma solução? Eu deveria mesclar vários h5py arquivos em um maior? Ou outros métodos? Obrigado antecipadamente!