Чтение файлов h5py в тензоры - PullRequest
0 голосов
/ 02 апреля 2020

Итак, у меня есть тренировочный набор и набор тестов в формате h5py. У меня также есть функция data_load, которая загружает файлы и возвращает массивы NumPy. Основная проблема в том, что мне не нужно NumPy, так как я работаю с Tensors. Я ожидаю иметь тензор x & y размера N (размер партии) и D_in (размер ввода для каждого изображения) и D_out (размер вывода каждого тензора).

Проблема:

x & y не конвертируйте в тензор размеров, упомянутых ниже. Если что-то их типы остаются numpy .ndarray. Любая помощь приветствуется.

def load_data(train_file, test_file):
# Load the training data

train_dataset =h5py.File(train_file, 'r')


# Separate features(x) and labels(y) for training set
train_set_x_orig =np.array(train_dataset["train_set_x"][:])
train_set_y_orig =np.array(train_dataset["train_set_y"][:])

# Load the test data
test_dataset =h5py.File(test_file,'r') 

# Separate features(x) and labels(y) for training set
test_set_x_orig =np.array(test_dataset["test_set_x"][:]) 
test_set_y_orig =np.array(test_dataset["test_set_y"][:])

classes = np.array(test_dataset["list_classes"][:]) # the list of classes

train_set_y_orig = torch.from_numpy(train_set_y_orig.reshape((1, train_set_y_orig.shape[0])))
test_set_y_orig = torch.from_numpy(test_set_y_orig.reshape((1, test_set_y_orig.shape[0])))

return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes






x = torch.Tensor(N, D_in)
y = torch.Tensor(N, D_out)
train_file="data/train_catvnoncat.h5"
test_file="data/test_catvnoncat.h5"
x,y,_,_,_=load_data(train_file,test_file)

1 Ответ

1 голос
/ 02 апреля 2020

Поскольку вы не преобразовали train_set_x_orig в тензор факела перед возвратом. Либо используйте torch.from_numpy() на train_set_x_orig перед возвратом, как вы делаете с train_set_y_orig, либо приведите его к тензору перед присвоением x.

Однако y должно иметь тип torch.tensor.


Ниже приведена демонстрация, объясняющая проблему:

# some sample tensor
In [27]: x = torch.Tensor(3, 2)    

# check its type
In [28]: type(x)   
Out[28]: torch.Tensor

# some sample ndarray
In [29]: arrx = np.arange(6).reshape(3, -1)   

# assign array to tensor
# note that now the object `x` refers to the numpy array object
In [30]: x = arrx     

# see that the type() of `x` is now numpy ndarray
In [31]: type(x)  
Out[31]: numpy.ndarray

Кроме того, как указал hpaulj в комментариях, нет необходимости переносить нарезанные объекты из h5py в np.array(), поскольку нарезанные объекты уже имеют тип numpy ndarrays. Таким образом, вы можете просто избавиться от них, и код будет выглядеть чище!

...