2021SC@SDUSC-山东大学软件工程与实践-Senta(六)

本篇续接2021SC@SDUSC-山东大学软件工程与实践-Senta(5),继续对Senta中的Elmo模型进行分析。

def encoder_wrapper(x_emb,
                    vocab_size,
                    emb_size,
                    init_hidden=None,
                    init_cell=None,
                    para_name='',
                    args=None):
    """
    encoder_wrapper
    """
    rnn_input = x_emb
    rnn_outs = []
    rnn_outs_ori = []
    cells = []
    projs = []
    num_layers = 2
    for i in range(num_layers):
        if init_hidden and init_cell:
            h0 = layers.squeeze(
                layers.slice(
                    init_hidden, axes=[0], starts=[i], ends=[i + 1]),
                axes=[0])
            c0 = layers.squeeze(
                layers.slice(
                    init_cell, axes=[0], starts=[i], ends=[i + 1]),
                axes=[0])
        else:
            h0 = c0 = None
        rnn_out, cell, input_proj = lstmp_encoder(
            rnn_input, hidden_size, h0, c0, para_name + 'layer{}'.format(i + 1),
            emb_size, args)
        rnn_out_ori = rnn_out
        if i > 0:
            rnn_out = rnn_out + rnn_input
        rnn_out.stop_gradient = True
        rnn_outs.append(rnn_out)
        rnn_outs_ori.append(rnn_out_ori)
    return rnn_outs, rnn_outs_ori

paddle.fluid.layers.squeeze(input, axes, name=None) : 根据axes压缩输入Tensor的维度。如果指定了axes,则会删除axes中指定的维度,axes指定的维度要等于1。

input (Variable) - 输入任意维度的Tensor。
支持的数据类型:float32,float64,int8,int32,int64。

axes (list) - 输入一个或一列整数,代表要压缩的轴。axes的范围: [−rank(input),rank(input)) 。
axes为负数时, axes=axes+rank(input) 。

paddle.fluid.layers.slice(input, axes, starts, ends)
沿多个轴生成 input 的切片。

input (Variable)- 多维 Tensor 或 LoDTensor,数据类型为 float16, float32,float64,int32,或 int64。

axes (list|tuple)- 数据类型是 int32。表示进行切片的轴。

starts (list|tuple|Variable)- 表示在各个轴上切片的起始索引值。

ends(list|tuple|Variable)- 表示在各个轴上切片的结束索引值。

def weight_layers(lm_embeddings, name="", l2_coef=0.0):

    n_lm_layers = len(lm_embeddings)
    W = layers.create_parameter(
        [n_lm_layers, ],
        dtype="float32",
        name=name + "ELMo_w",
        attr=fluid.ParamAttr(
            name=name + "ELMo_w",
            initializer=fluid.initializer.Constant(0.0),
            regularizer=fluid.regularizer.L2Decay(l2_coef)))
    normed_weights = layers.softmax(W + 1.0 / n_lm_layers)
    splited_normed_weights = layers.split(normed_weights, n_lm_layers, dim=0)

    # compute the weighted, normalized LM activations
    pieces = []
    for w, t in zip(splited_normed_weights, lm_embeddings):
        pieces.append(t * w)
    sum_pieces = layers.sums(pieces)

    # scale the weighted sum by gamma
    gamma = layers.create_parameter(
        [1],
        dtype="float32",
        name=name + "ELMo_gamma",
        attr=fluid.ParamAttr(
            name=name + "ELMo_gamma",
            initializer=fluid.initializer.Constant(1.0)))
    weighted_lm_layers = sum_pieces * gamma
    return weighted_lm_layers

paddle.fluid.layers.create_parameter(shape, dtype, name=None,attr=None, is_bias=False, default_initializer=None) 创建一个参数,作为一个可学习的变量, 拥有梯度并且可优化。

shape (list[int]) - 指定输出Tensor的形状,它可以是一个整数列表。

dtype (str|numpy.dtype) – 初始化数据类型。可设置的字符串值有:“float16”,“float32”,“float64”。

attr (ParamAttr,可选) - 指定参数的属性对象。具体用法请参见 ParamAttr ,默认值为None。

is_bias (bool,可选) -当default_initializer为空,该值会对选择哪个默认初始化程序产生影响。如果is_bias为真,则使用initializer.Constant(0.0),否则使用Xavier(),默认值False。

default_initializer (Initializer,可选) - 参数的初始化程序,默认值为空。

本篇Senta中的Elmo模型源码分析到此结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值