Авто-кодировщик для векторных кодировок - PullRequest
0 голосов
/ 05 декабря 2018

Вот автокодер, который я написал для кодирования двух векторов:

[1,2,3] & [1,2,3]

Векторы созданы в: features = torch.tensor(np.array([ [1,2,3],[1,2,3] ]))

Это работаетсогласно коду:

%reset -f

epochs = 1000
from pylab import plt
plt.style.use('seaborn')
import torch.utils.data as data_utils
import torch
import torchvision
import torch.nn as nn
from torch.autograd import Variable

cuda = torch.cuda.is_available()
FloatTensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor
import numpy as np
import pandas as pd
import datetime as dt


features = torch.tensor(np.array([ [1,2,3],[1,2,3] ]))

print(features)

batch = 2
data_loader = torch.utils.data.DataLoader(features, batch_size=2, shuffle=True)

encoder = nn.Sequential(nn.Linear(3,batch), nn.Sigmoid())
decoder = nn.Sequential(nn.Linear(batch,3), nn.Sigmoid())
autoencoder = nn.Sequential(encoder, decoder)

optimizer = torch.optim.Adam(params=autoencoder.parameters(), lr=0.001)

encoded_images = []
for i in range(epochs):
    for j, (images, _) in enumerate(data_loader):
    #     images = images.view(images.size(0), -1) 
        images = Variable(images).type(FloatTensor)
        optimizer.zero_grad()
        reconstructions = autoencoder(images)
        loss = torch.dist(images, reconstructions)
        loss.backward()
        optimizer.step()

        encoded_images.append(encoder(images))

Но когда я добавляю новый вектор:

features = torch.tensor(np.array([ [1,2,3],[1,2,3],[1,2,3] ]))

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

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-223-3ca45519e975> in <module>
     32 encoded_images = []
     33 for i in range(epochs):
---> 34     for j, (images, _) in enumerate(data_loader):
     35     #     images = images.view(images.size(0), -1)
     36         images = Variable(images).type(FloatTensor)

ValueError: not enough values to unpack (expected 2, got 1)

Правильно ли я настроил загрузчик данных

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Я не уверен, что именно относится к _.Но часто полезно взглянуть на небольшой пример, чтобы увидеть, что на самом деле делает код:

Вот ваш загрузчик данных с размером пакета 2 и 2 обучающих примеров в наборе данных:

features = torch.tensor(np.array([ [1,2,3],[1,2,3] ]))

#print(features)

data_loader = torch.utils.data.DataLoader(features, batch_size=2, shuffle=True)
for j, (images) in enumerate(data_loader):
    print(j, images)

Вывод:

0 tensor([[ 1,  2,  3],
        [ 1,  2,  3]])

Итак, в вашем случае вы распаковали его, соответственно.разделите ваш тензор на (images, _):

t = torch.tensor([ [1,2,3],[1,2,3] ])
(images, _) = t
print('images:',images, '_:',_)
# prints: 
# images: tensor([ 1,  2,  3]) _: tensor([ 1,  2,  3])

Это отлично работает для набора данных из двух примеров и размера пакета 2, потому что вы можете распаковать тензор.Однако, когда у вас есть 3 обучающих примеров в вашем наборе данных, последняя партия содержит только один пример:

features = torch.tensor(np.array([ [1,2,3],[1,2,3],[1,2,3]]))

#print(features)

data_loader = torch.utils.data.DataLoader(features, batch_size=2, shuffle=True)
for j, (images) in enumerate(data_loader):
    print(j, images)

Вывод:

0 tensor([[ 1,  2,  3],
        [ 1,  2,  3]])
1 tensor([[ 1,  2,  3]])

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

Но я надеюсь, что этот пример немного полезен!

0 голосов
/ 05 декабря 2018

ваш набор данных (внутри DataLoader) возвращает только image за элемент без метки .Когда вы повторяете и ожидаете, что каждый элемент будет (image, _), вы пытаетесь распаковать объект без метки в image и _, и это невозможно.Вот почему вы получаете «недостаточно значений для распаковки» ошибка

...