用于矢量编码的自动编码器

Auto-encoder for vector encodings

这是我编写的用于对两个向量进行编码的自动编码器:

[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)

我是否正确设置了数据加载器?

您的数据集(在 DataLoader 内部)returns 每个项目仅 image 没有 标签。当您迭代并期望每个项目都是 (image, _) 时,您正在尝试将没有标签的功能解压缩到 image_ 中,这是不可能的。这就是为什么你得到 "not enough values to unpack" 错误

我不确定 _ 到底指的是什么。 但是看一个小例子通常很有帮助,看看代码实际做了什么:

这是您的数据加载器,批量大小为 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]])

此时你得到解包错误,因为你不能拆分最后一批。但正如 Shai 所建议的那样,您没有使用任何标签,因此您可能想要使用完全不同的设置。

但我希望这个例子有点帮助!