首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用放火RNN强迫教师

用放火RNN强迫教师
EN

Stack Overflow用户
提问于 2017-11-02 14:33:05
回答 1查看 4.1K关注 0票数 7

通过定义输入层和隐藏层,并手动将隐藏层反馈到网络中以记住状态,Py火炬教程在说明基本RNN方面做了很大的工作。这样的灵活性让你可以很容易地执行老师的强迫。

问题1:在使用本机nn.RNN()模块时,您如何执行教师强制操作(因为整个序列是一次喂入的)?简单的RNN网络将是:

代码语言:javascript
复制
class SimpleRNN(nn.Module):

    def __init__(self, vocab_size,
                 embedding_dim,
                 batch_sz,
                 hidden_size=128,
                 nlayers=1,
                 num_directions=1,
                 dropout=0.1):

        super(SimpleRNN, self).__init__()

        self.batch_sz = batch_sz
        self.hidden_size = hidden_size

        self.encoder = nn.Embedding(vocab_size, embedding_dim)
        self.rnn = nn.RNN(embedding_dim, hidden_size, nlayers, dropout=0.5)
        self.decoder = nn.Linear(hidden_size, vocab_size)

    def init_hidden(self):
        return autograd.Variable(torch.zeros(nlayers, batch_sz, hidden_size)).cuda()

    def forward(self, inputs, hidden):

        # -- encoder returns:
        # -- [batch_sz, seq_len, embed_dim]
        encoded = self.encoder(inputs) 
        _, seq_len, _ = encoded.size()

        # -- rnn returns:
        # -- output.size() = [seq_len, batch_sz, hidden_sz]
        # -- hidden.size() = [nlayers, batch_sz, hidden_sz]
        output, hidden = self.rnn(encoded.view(seq_len, batch_sz, embedding_dim), hidden)

        # -- decoder returns:
        # -- output.size() = [batch_sz, seq_len, vocab_size]
        output = F.log_softmax(decoder(output.view(batch_sz, seq_len, self.hidden_size)))

        return output, hidden

在那里我可以打电话给网络:

代码语言:javascript
复制
model = SimpleRNN(vocab_size, embedding_dim, batch_sz).cuda()
x_data, y_data = get_sequence_data(train_batches[0])
output, hidden = model(x_data, model.init_hidden())

为了完整起见,以下是我的x_dataoutputhidden的形状

代码语言:javascript
复制
print(x_data.size(), output.size(), hidden.size())
torch.Size([32, 80]) torch.Size([32, 80, 4773]) torch.Size([1, 32, 128])

问题2:是否可以使用这个SimpleRNN网络逐字生成一个序列,首先给它一个<GO_TOKEN>,然后迭代直到到达<END_TOKEN>?我问是因为当我运行这个:

代码语言:javascript
复制
x_data = autograd.Variable(torch.LongTensor([[word2idx['<GO>']]]), volatile=True).cuda()
output, hidden = model(x_data, model.init_hidden(1))

print(output, output.sum())

我得到了所有的output,和output.sum() = 0。即使在训练网络和反向传播损失之后,我也得到了这个机会。知道为什么吗?

问题3:如果不是效率很低的话,是否可以逐字地训练SimpleRNN网络,就像在这里展示的tutorial.html](尽管在那里他们是逐个训练)。

EN

回答 1

Stack Overflow用户

发布于 2017-12-05 09:14:03

问题1.

在这种情况下,教师强制是隐式执行的,因为您的x_data是seq_len,所以batch_size将在seq_len中的每个项中作为输入而不使用下一个输入的实际输出。

问题2.

您的model.init_hidden不接受任何输入,但是看起来您正在尝试添加批处理大小,也许您可以检查一下,其他的一切看起来都很好。尽管您需要对输出执行max()或多项式(),然后才能将其反馈回去。

问题3.

是的,你可以这样做,是的,这是非常低效的。这是CUDNN LSTM内核的一个限制。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47077831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档