用于矢量编码的自动编码器
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 所建议的那样,您没有使用任何标签,因此您可能想要使用完全不同的设置。
但我希望这个例子有点帮助!
这是我编写的用于对两个向量进行编码的自动编码器:
[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 所建议的那样,您没有使用任何标签,因此您可能想要使用完全不同的设置。
但我希望这个例子有点帮助!