本篇续接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模型源码分析到此结束。