Keras, как добавить слой внимания для взвешенной суммы - PullRequest
0 голосов
/ 27 ноября 2018

У меня следующая сетевая архитектура (ниже показана только соответствующая часть сети)

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'

Я думаю, что это связано с размерами входных параметров, но я не уверенкак это исправить.

1 Ответ

0 голосов
/ 27 ноября 2018

Если вы исправите h, вам придется фиксировать длину ввода.Вы указываете значение None, но ваши размеры будут совпадать только в случае h==input_size.Странно, что вы даже можете передать неопределенный размер в плотный слой, обычно вы получите ошибку типа ValueError: The last dimension of the inputs to 'Dense' should be defined. Found 'None'.

Обратите внимание, что на входном слое у вас нет batch_size.Поэтому, если ваш тензор должен иметь размер (batch_size, dim1), вы создаете ввод, например Input((dim1,))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...