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

时间:2018-12-04 21:09:04

标签: pytorch autoencoder

这是我写的一种自动编码器,用于编码两个向量:

[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 :(得分:1)

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

这是您的数据加载器,其数据集中的批量为22个训练示例:

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所建议的那样,您没有使用任何标签,所以您可能希望使用完全不同的设置。

但是我希望这个例子会有所帮助!

答案 1 :(得分:0)

您的数据集(在DataLoader内部)对于每个没有标签的项目仅返回image。当您迭代并期望每个项目都是(image, _)时,您尝试将没有标签的功能解包到image_中,这是不可能的。这就是为什么您会收到“没有足够的值要解压”错误的原因