Pytorch 使用Softmax分类器构建自动编码器-输入不匹配错误
我试图训练一个带有softmax分类器的自动编码器来复制本文中的结果 我的实施如下:Pytorch 使用Softmax分类器构建自动编码器-输入不匹配错误,pytorch,classification,autoencoder,Pytorch,Classification,Autoencoder,我试图训练一个带有softmax分类器的自动编码器来复制本文中的结果 我的实施如下: n_embedded = 400 class AE400_10(nn.Module): def __init__(self): super(AE400_10, self).__init__() self.encoder = nn.Sequential(nn.Linear(28*28, n_embedded), nn.Sigmoid()) self.deco
n_embedded = 400
class AE400_10(nn.Module):
def __init__(self):
super(AE400_10, self).__init__()
self.encoder = nn.Sequential(nn.Linear(28*28, n_embedded), nn.Sigmoid())
self.decoder = nn.Sequential(nn.Linear(n_embedded, 28*28))
self.classifier = nn.Sequential(nn.Linear(28*28, 10))
def forward(self, x):
x = x.view(-1, 28*28)
encoded = self.encoder(x)
decoded = self.decoder(encoded)
out = self.classifier(decoded) ##NEW UPDATED
return decoded, F.log_softmax(out)
model = AE400_10().to(device)
criterion1 = nn.MSELoss()
criterion2 = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
for epoch in range(epochs):
total_batch = len(train_set) // batch_size_train
for batch_idx, (data, target) in enumerate(MNSIT_train):
X = data.to(device)
Y = target.to(device)
optimizer.zero_grad()
decoded, out = model(X)
loss1 = criterion1(decoded, inputs)
loss2 = criterion2(out, labels)
loss = loss1 + loss2
loss.backward()
optimizer.step()
if (batch_idx+1) % 100 == 0:
print('Epoch [%d/%d], lter [%d/%d], Loss: %.4f'%(epoch+1, epochs, batch_idx+1, total_batch, cost.item()))
对于培训,我有以下几点:
n_embedded = 400
class AE400_10(nn.Module):
def __init__(self):
super(AE400_10, self).__init__()
self.encoder = nn.Sequential(nn.Linear(28*28, n_embedded), nn.Sigmoid())
self.decoder = nn.Sequential(nn.Linear(n_embedded, 28*28))
self.classifier = nn.Sequential(nn.Linear(28*28, 10))
def forward(self, x):
x = x.view(-1, 28*28)
encoded = self.encoder(x)
decoded = self.decoder(encoded)
out = self.classifier(decoded) ##NEW UPDATED
return decoded, F.log_softmax(out)
model = AE400_10().to(device)
criterion1 = nn.MSELoss()
criterion2 = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
for epoch in range(epochs):
total_batch = len(train_set) // batch_size_train
for batch_idx, (data, target) in enumerate(MNSIT_train):
X = data.to(device)
Y = target.to(device)
optimizer.zero_grad()
decoded, out = model(X)
loss1 = criterion1(decoded, inputs)
loss2 = criterion2(out, labels)
loss = loss1 + loss2
loss.backward()
optimizer.step()
if (batch_idx+1) % 100 == 0:
print('Epoch [%d/%d], lter [%d/%d], Loss: %.4f'%(epoch+1, epochs, batch_idx+1, total_batch, cost.item()))
但我得到了以下错误:
运行时错误:大小不匹配,m1:[128 x 400],m2:[784 x 10]at
/Users/soumith/mc3build/conda bld/pytorch_1549593514549/work/aten/src/TH/generic/THTensorMath.cpp:940
我理解这是维度中的一个错误,但我不确定为什么会发生
::更新::
我根据下面的注释修复了分类器的输入,现在我得到以下错误:
RuntimeError:张量a(784)的大小必须与张量的大小匹配
b(28)在非单态维数3下
我不使用
nn.Sequential
,所以我不确定为什么会发生这种情况,但如果
替换
与
你的代码有效
-->
我不使用
nn.Sequential
,所以我不确定为什么会发生这种情况,但如果
替换
与
你的代码有效
-->
而不是
encoded
out=self.classifier(编码)
将解码后的数据作为分类器的输入
out = self.classifier(decoded)
我认为,这就是为什么会出现这种不匹配,因为分类器希望输入28*28的张量,正如代码中定义的那样
然后,调用标准时:
loss1 = criterion1(decoded, X)
loss2 = criterion2(out, Y)
而不是
encoded
out=self.classifier(编码)
将解码后的数据作为分类器的输入
out = self.classifier(decoded)
我认为,这就是为什么会出现这种不匹配,因为分类器希望输入28*28的张量,正如代码中定义的那样
然后,调用标准时:
loss1 = criterion1(decoded, X)
loss2 = criterion2(out, Y)
我已经更新了代码,现在我得到了一个新的错误,粘贴在Hello@Loverter上面,我认为这个错误就是您调用这两个标准的方式。我已经更新了上面的答案。我已经更新了代码,现在我得到了一个新的错误,粘贴在Hello@Loverter上面,我认为这个错误就是你调用这两个标准的方式。我已经更新了上面的答案。尝试了你的建议,但我在尝试开始训练时出现了以下错误:运行时错误:张量a(784)的大小必须与张量b(28)在非单态维度的大小相匹配3尝试了你的建议,但我在尝试开始训练时出现了以下错误:运行时错误:张量a(784)的大小必须匹配非单态维度3的张量b(28)的大小