这是我编写的一个自动编码器,用于编码两个矢量:
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)
我是否正确设置了数据加载程序?
我不确定_
到底指的是什么。但是,看看一个小例子,看看代码的实际作用,通常是有帮助的:
以下是您的数据加载器,数据集中有批量大小的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所建议的,你没有使用任何标签,所以你可能想使用一个完全不同的设置。
但我希望这个例子能有所帮助!
您的数据集(在DataLoader内(在没有标签的情况下,每个项目只返回image
。当您迭代并期望每个项都是[1,2,3]
0时,您正试图将没有标签的功能解压缩到image
和_
中,但这是不可能的。这就是为什么你得到"没有足够的值来解包"错误