Pytorch 使用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

我试图训练一个带有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.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)的大小