Tensorflow的AdditiveAttention实现没有权重

问题描述

我试图了解如何在Tensorflow / Keras中实现新的(自定义)图层。 Bahdanau的“添加剂注意”似乎很简单。机制的一部分是这样的:

enter image description here

这是implemented by tensorflow。但是,看一下代码,我似乎找不到tanh函数中应该使用的权重。这使我觉得我对Tensorflow中的图层了解不足。另一个结论是tensorflow在这里没有实现权重。这似乎不太可能。

我想解释一下Tensorflow如何将此机制实现为自定义层。

Tensorflow的AdditiveAttention的子类如下:

 def __init__(self,use_scale=True,**kwargs):
    super(AdditiveAttention,self).__init__(**kwargs)
    self.use_scale = use_scale

  def build(self,input_shape):
    v_shape = tensor_shape.TensorShape(input_shape[1])
    dim = v_shape[-1]
    if isinstance(dim,tensor_shape.Dimension):
      dim = dim.value
    if self.use_scale:
      self.scale = self.add_weight(
          name='scale',shape=[dim],initializer=init_ops.glorot_uniform_initializer(),dtype=self.dtype,trainable=True)
    else:
      self.scale = None
    super(AdditiveAttention,self).build(input_shape)

唯一的权重是self.scale。稍后,它在_calculate_scores(query,key)中与tanh函数一起使用:

math_ops.reduce_sum(scale * math_ops.tanh(q_reshaped + k_reshaped),axis=-1)

如Bahdanau的得分方​​程所示,可训练的权重应乘以查询q_reshaped)和键(k_reshaped)?

q_reshapedk_reshaped内容传递到call()函数中,如下所示:

def call(self,inputs,mask=None,training=None):
    self._validate_call_args(inputs=inputs,mask=mask)
    q = inputs[0]
    v = inputs[1]
    k = inputs[2] if len(inputs) > 2 else v
    q_mask = mask[0] if mask else None
    v_mask = mask[1] if mask else None
    scores = self._calculate_scores(query=q,key=k)
...

权重应在调用call()之后创建。 (call(),调用build())。所以在我看来,查询和键没有加权。

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...