PyTorch:GRU,一对多/多对一

问题描述

我想实现一个 GRU,能够将向量序列编码为一个向量(多对一),然后另一个 GRU 能够将向量解码为向量序列(一对多)。向量的大小不会改变。我想对我实施的内容发表意见。

代码如下:

class GRU(nn.Module):
    def __init__(self,opt):
        super(GRU,self).__init__()

        self.input_size = 512*3
        self.length_sequence = 30
        self.hidden_size = self.input_size
        self.num_layers = 1

        self.GRU_enc = nn.GRU(input_size=self.input_size,hidden_size=self.hidden_size,num_layers=self.num_layers,batch_first=True)

        self.GRU_dec = nn.GRU(input_size=self.input_size,batch_first=True)
    
    # many-to-one
    def enc(self,x):
        # x is of shape BxLx512*3

        h0 = torch.zeros(self.num_layers,x.shape[0],self.hidden_size).cuda()

        out,_ = self.GRU_enc(x,h0)

        out_last = out[:,-1,:]

        return out_last

    # one-to-many
    def dec(self,x):
        x = x[:,None,...]

        h = torch.zeros(self.num_layers,self.hidden_size).cuda()

        outputs = []

        for i in range(self.length_sequence):
            out,h = self.GRU_dec(x,h)
            outputs.append(out)

        output = torch.cat(outputs,dim=1)

        return output

    def forward(self,x):
        one = self.enc(x)

        many = self.dec(one)

        return many

我不确定这是否是执行一对多 GRU 的好方法。我可以对此发表一些意见吗?

另外,你认为我需要在编码/解码后添加一些线性层,或者一些激活函数吗?

最后,参数数量相当大(一层28M,两层55M)。我的数据集中需要多少个样本才能学到东西?

感谢阅读!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)