【问题标题】:Keras how to add an attention layer for a weighted sumKeras如何为加权和添加注意层
【发布时间】:2018-11-27 10:45:12
【问题描述】:

我有以下一个网络架构(下面只展示了网络的相关部分)

vocab_dimension = 1500
embed_dimension = 10


x = [Input(shape=(None, ), name='input', dtype='int32'),
     Input(shape=(None, ), name='weights'),
     Input(shape=(None, ), name='neg_examples', dtype='int32')]


embedding_layer = Embedding(input_dim=vocab_dimension, output_dim=embed_dimension)


def _weighted_sum(x):
    return K.sum(x[0] * K.expand_dims(x[1], -1), axis=1, keepdims=True)


weighted_sum = Lambda(_weighted_sum, name='weighted_sum')

item_vecs = embedding_layer(x[2])
user_vecs = weighted_sum([embedding_layer(x[0]), x[1]])

这里的问题是我不想将权重作为输入传递,但我想“学习”它们,就像在注意力层中一样。

我知道可以这样创建注意力层

attention_probs = Dense(h, activation='softmax', name='attention_probs')(x[0])
weighted_sum = Lambda(_weighted_sum)([x[0], attention_probs])

h 等于输入长度的维度,我将其设置为 5。但是,如果执行上述操作,则会出现以下错误 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

我认为这与输入参数的尺寸有关,但我不确定如何解决。

【问题讨论】:

  • 您不能将形状未知的输入张量传递给 Dense 层。
  • 您也不能将未知形状传递给加权和。 (你最终会遇到完全相同的问题) - 考虑使用Input(shape=(someActualLength,))
  • 谢谢,我就是这么想的

标签: keras embedding attention-model


【解决方案1】:

如果您修复h,您将不得不修复输入的长度。您将其设为None,但您的尺寸仅在h==input_size 的情况下才会匹配。奇怪的是,您甚至可以将未定义的大小传递给 Dense 层,通常您会收到类似ValueError: The last dimension of the inputs to 'Dense' should be defined. Found 'None'. 的错误

请注意,在输入层中,您没有 batch_size。因此,如果您的后端张量的大小应为 (batch_size,dim1),您可以创建类似 Input((dim1,))

的输入

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2021-03-27
    • 2017-05-30
    • 2017-08-12
    • 2015-09-15
    • 2019-03-06
    相关资源
    最近更新 更多