为了账号安全,请及时绑定邮箱和手机立即绑定

将循环层附加到具有不同隐藏大小的 PyTorch LSTM 模型

将循环层附加到具有不同隐藏大小的 PyTorch LSTM 模型

动漫人物 2021-09-11 10:27:10
我正在使用 PyTorch 开发用于序列分析的 BI-LSTM 模型。我正在使用torch.nn.LSTM. 使用该模块,您可以拥有多个层,只需传递一个参数num_layers作为层数(例如,num_layers=2)。然而,它们都是相同的hidden_size,这对我来说部分好,我只是想让它们都一样,hidden_size 但最后一层的大小不同。基本示例如下:rnn = nn.LSTM(input_size=10, hidden_size=20, num_layers=2)inp = torch.randn(5, 3, 10)h0 = torch.randn(2, 3, 20)c0 = torch.randn(2, 3, 20)output, (hn, cn) = rnn(inp, (h0, c0))输出昏暗为 ( 5, 3,20)一个解决方案(但对我不利)是实现额外的模型,该模型输出我需要的维度并从第一个模型中获取输入,例如:rnn_two = nn.LSTM(input_size=20, hidden_size=2)output2, _ = rnn_two(output)但是,我不想这样做,因为我使用并行化模型DataParallel,所以我需要全部成为一个包。我希望找到类似于 keras 的东西,例如:rnn.add(LSTM, hidden_size=2)我检查了LSTM 源代码,但找不到我需要的。有什么建议?
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

如果我没记错的话,可以这样做:


import torch.nn as nn

import torch.nn.functional as F


class RnnWith2HiddenSizesModel(nn.Module):

    def __init__(self):

        super(RnnWith2HiddenSizesModel, self).__init__()

        self.rnn = nn.LSTM(input_size=10, hidden_size=20, num_layers=2)

        self.rnn_two = nn.LSTM(input_size=20, hidden_size=2)


    def forward(self, inp, hc):

        output, _ = self.rnn(inp, hc)

        output2, _ = self.rnn_two(output)

        return output2



inp = torch.randn(5, 3, 10)

h0 = torch.randn(2, 3, 20)

c0 = torch.randn(2, 3, 20)


rnn = RnnWith2HiddenSizesModel()


output = RnnWith2HiddenSizesModel()(inp, (h0, c0))



tensor([[[-0.0305,  0.0327],

     [-0.1534, -0.1193],

     [-0.1393,  0.0474]],


    [[-0.0370,  0.0519],

     [-0.2081, -0.0693],

     [-0.1809,  0.0826]],


    [[-0.0561,  0.0731],

     [-0.2307, -0.0229],

     [-0.1780,  0.0901]],


    [[-0.0612,  0.0891],

     [-0.2378,  0.0164],

     [-0.1760,  0.0929]],


    [[-0.0660,  0.1023],

     [-0.2176,  0.0508],

     [-0.1611,  0.1053]]], grad_fn=<CatBackward>)


查看完整回答
反对 回复 2021-09-11
?
桃花长相依

TA贡献1860条经验 获得超8个赞

尽管@Mikhail Berlinkov 的回答按需要工作这一事实,但它并没有推广到一般情况(甚至在问题中都没有要求),为此我想提出第二个解决方案:


import torch

import torch.nn as nn

import torch.nn.functional as F

from functools import reduce


class RNNModel(nn.Module):

    def __init__(self, *models):

        super(RNNModel, self).__init__()

        self.models = models


    def forward(self, inp):

        return reduce(lambda arg, model: model(arg, None)[0], self.models, inp)

并且可以称为:


rnn = nn.LSTM(input_size=10, hidden_size=20, num_layers=2)

rnn_two = nn.LSTM(input_size=20, hidden_size=2)

inp = torch.randn(5, 3, 10)


rnn_model = RNNModel(rnn, rnn_two)


output = rnn_model(inp)

output.shape等于预期(即,5,3,2)


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信