矢量编码的自动编码器



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

CCD_ 1&[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)

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

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

以下是您的数据加载器,数据集中有批量大小的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所建议的,你没有使用任何标签,所以你可能想使用一个完全不同的设置。

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

您的数据集(在DataLoader内(在没有标签的情况下,每个项目只返回image。当您迭代并期望每个项都是[1,2,3]0时,您正试图将没有标签的功能解压缩到image_中,但这是不可能的。这就是为什么你得到"没有足够的值来解包"错误

相关内容

  • 没有找到相关文章

最新更新