【问题标题】:Seq2seq encoder returns same hidden state for all sentences in pytorchSeq2seq 编码器为 pytorch 中的所有句子返回相同的隐藏状态
【发布时间】:2018-07-18 07:09:03
【问题描述】:

我正在尝试实现一个 seq2seq 编码器-解码器,它可以从英语句子中重构相同的英语句子。解码器工作正常(受过教师训练,强制它重建有效句子),但编码器为任何句子返回相同的隐藏编码。

我正在使用 pytorch,我想知道这是否是一个常见问题。这可能是什么原因?

hidden_size = 300
output_size = vocabularySize

class EncoderLSTM(nn.Module):
def __init__(self,emb_dim=vocabularySize):
    super(EncoderLSTM,self).__init__()
    self.lstm = nn.LSTM(emb_dim,hidden_size)

def forward(self,X,h):
    X=X.view(1,1,-1)
    #print(X.shape,h[0].shape,h[1].shape)
    st,h2=self.lstm(X,h)
    #print(st.shape)
    return h2

def initHidden(self):
    result = (Variable(torch.zeros(1, 1,hidden_size)),Variable(torch.zeros(1, 1, hidden_size)))
    return result

...

hidden = encoder.initHidden()
for i in range(target_length):
    encoder_input=target_variable[0][target_length-1-i]
    hidden = encoder.forward(encoder_input,hidden)



...

for i in range(1,target_length):  


    pred,hidden = decoder.forward(decoder_input,hidden)

    target = target_variable[0][i].unsqueeze(0)
    values,ids = target.data.topk(1)
    target_id = Variable(torch.from_numpy(np.array([ids[0][0]])).long())

    loss+= criterion(pred[0],target_id)

...

loss/=target_length
encoder_optimizer.zero_grad()
decoder_optimizer.zero_grad()
loss.backward()
encoder_optimizer.step()
decoder_optimizer.step()

【问题讨论】:

    标签: lstm pytorch


    【解决方案1】:

    这是不可能的。您不能查看每个新输入句子的整个隐藏状态。如果它们驱动不同的输出,它们必须是不同的。也许您正在查看整个批次的某种最终隐藏状态。

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 2019-06-12
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多