paddlepaddle实现gru

最近用用paddlepaddle实现了一下grucell,这里分享一下代码:

import paddle
import paddle.nn as nn
import paddle.nn.functional as F

class GRUCell(nn.Layer):

    def __init__(self, input_size, hidden_size):
        super(GRUCell, self).__init__()
        # 输入单元的大小
        self.input_size = input_size
        # 隐藏单元的大小
        self.hidden_size = hidden_size
        # 输入单元映射的权重
        weight_attr1 = paddle.ParamAttr(name="weight1",initializer=paddle.nn.initializer.Constant(value=0.5))
        # 输入单元映射的偏置
        bias_attr1= paddle.ParamAttr(name="bias1",initializer=paddle.nn.initializer.Constant(value=1.0))
        # 隐藏单元映射的权重
        weight_attr2 = paddle.ParamAttr(name="weight2",initializer=paddle.nn.initializer.Constant(value=0.5))
        # 隐藏单元映射的偏置
        bias_attr2 = paddle.ParamAttr(name="bias2",initializer=paddle.nn.initializer.Constant(value=1.0))
        # 输入映射 w*x+b
        self.x2h = nn.Linear(input_size, 3 * hidden_size, weight_attr=weight_attr1,bias_attr=bias_attr1)
        # 隐藏映射 w*h+b
        self.h2h = nn.Linear(hidden_size, 3 * hidden_size, weight_attr=weight_attr2,bias_attr=bias_attr2)
    
    def forward(self, x, hidden):
        
        # 用全连接层给x乘上w,加上bias
        x_t = self.x2h(x) 
        # 用全连接层给h_t乘上w,加上bias
        h_t = self.h2h(hidden)
        
        # 将输入x_t分割成3个子Tensor
        x_reset, x_update, x_new = x_t.chunk(3, 1)
        # 将输入h_t分割成3个子Tensor
        h_reset, h_update, h_new = h_t.chunk(3, 1)
        
        # 重置门
        r_t = F.sigmoid(x_reset + h_reset)
        # 更新门
        z_t = F.sigmoid(x_update + h_update)
        # 当前记忆内容
        new_gate = F.tanh(x_new + (r_t * h_new))
        # 当前时间步的最终记忆
        h_t =(1-z_t)*hidden+z_t*new_gate 
        return h_t

if __name__=="__main__":
    model=GRUCell(16,16)
    x = paddle.randn((1, 16))
    hidden=paddle.randn((1,16))
    res=model(x,hidden)
    print(res)

如果有问题,可以和我交流哈。

参考文献

[1].https://github.com/georgeyiasemis/Recurrent-Neural-Networks-from-scratch-using-PyTorch/blob/main/rnncells.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值