这是我写的一种自动编码器,用于编码两个向量:
[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)
我是否正确设置了数据加载器?
答案 0 :(得分: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所建议的那样,您没有使用任何标签,所以您可能希望使用完全不同的设置。
但是我希望这个例子会有所帮助!
答案 1 :(得分:0)
您的数据集(在DataLoader内部)对于每个没有标签的项目仅返回image
。当您迭代并期望每个项目都是(image, _)
时,您尝试将没有标签的功能解包到image
和_
中,这是不可能的。这就是为什么您会收到“没有足够的值要解压”错误的原因