ValueError: слишком много значений для распаковки при использовании тензоров torch - PullRequest
1 голос
/ 16 июня 2020

Для проекта по нейронным сетям я использую Pytorch и работаю с набором данных EMNIST.

Код, который уже задан, загружается в набор данных:

train_dataset = dsets.MNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),
                            download=True)

И подготавливает его:

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
                                           batch_size=batch_size, 
                                           shuffle=True)

Затем, когда все конфигурации сети определены , существует l oop для обучения модели за эпоху:

 for i, (images, labels) in enumerate(train_loader):

В примере кода это работает нормально.

Для моей задачи мне предоставляется набор данных, который я загружаю следующим образом:

emnist = scipy.io.loadmat("DIRECTORY/emnist-letters.mat")

data = emnist ['dataset']
X_train = data ['train'][0, 0]['images'][0, 0]
y_train = data ['train'][0, 0]['labels'][0, 0]

Затем я создаю train_dataset следующим образом:

train_dataset = np.concatenate((X_train, y_train), axis = 1)
train_dataset = torch.from_numpy(train_dataset)

И использую тот же шаг для его подготовки:

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
                                           batch_size=batch_size, 
                                           shuffle=True)

Однако, когда я пытаюсь использовать тот же l oop, что и раньше:

for i, (images, labels) in enumerate(train_loader):

, я получаю следующую ошибку:

ValueError: too many values to unpack (expected 2)

Кто знает, что я могу сделать, чтобы обучить свой набор данных с этим l oop?

1 Ответ

1 голос
/ 16 июня 2020

Набор данных, который вы создали из данных EMNIST, представляет собой одиночный тензор, и, следовательно, загрузчик данных также будет генерировать одиночный тензор, где первое измерение - это измерения пакета. Это приводит к попытке распаковать этот тензор по размерности пакета, что не работает, потому что размер вашего пакета больше двух, но это также не то, что вы хотите.

Вы можете использовать torch.utils.data.TensorDataset, чтобы легко создать набор данных, который создает кортеж изображений и их соответствующие метки, как это делает набор данных MNIST.

train_dataset = torch.utils.data.TensorDataset(torch.from_numpy(X_train), torch.from_numpy(y_train))
...