Как манипулировать операцией умножения обучаемого тензора в кератах? - PullRequest
0 голосов
/ 13 мая 2019

Я склонен строить модель, в которой одним входом модели является тензор с формой (?, 29, 64). Это определение в коде моей модели:

history_topics = Input (shape = (29, 64,), name = 'history')

А потом я перенес его в новый тензор в форме (?,64,29)

history_topics_trans = лямбда (лямбда х: K.tf.transpose (х, завивка = [0,2,1])) (history_topics)

И после этого я хочу инициализировать новый обучаемый тензор с именем da, имеющий форму (5, 64), и умножить da на history_topics_trans, чтобы получить новый тензор с формой (?,5,29).

Так как это реализовать? Спасибо.

1 Ответ

1 голос
/ 13 мая 2019

Вы можете просто использовать слой Dense для этого. Если вам не нужен термин смещения, вы можете установить use_bias=False.

import tensorflow as tf
from tensorflow import keras
K = keras.backend

history_topics = keras.layers.Input(shape=(29, 64), name='history')
history_topics_proj = keras.layers.Dense(5, use_bias=False)(history_topics)
history_topics_trans = keras.layers.Lambda(
    lambda x: tf.transpose(x, perm=[0,2,1]))(history_topics_proj)
model = keras.models.Model(inputs=[history_topics], outputs=[history_topics_trans])

model.summary()

Вот вывод:

Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
history (InputLayer)         [(None, 29, 64)]          0
_________________________________________________________________
dense_2 (Dense)              (None, 29, 5)             320
_________________________________________________________________
lambda_2 (Lambda)            (None, 5, 29)             0
=================================================================
Total params: 320
Trainable params: 320
Non-trainable params: 0
_________________________________________________________________

Вы можете увидеть вес слоя Dense следующим образом:

dense_layer = keras.layers.Dense(5, use_bias=False)
... # use the layer, so its weights get constructed
[weights] = dense_layer.get_weights()

Если вы хотите использовать условия смещения, просто не устанавливайте use_bias=False. В этом случае get_weights() вернет и матрицу весов, и вектор смещения:

dense_layer = keras.layers.Dense(5)
... # use the layer, so its weights get constructed
[weights, bias] = dense_layer.get_weights()

Слой Keras строится лениво, при первом использовании. Если вы попытаетесь получить веса до их построения, вы получите пустой список. Для принудительного создания весов вы можете вызвать слой для некоторых данных или просто вызвать метод build() напрямую:

dense_layer.build(input_shape=[None, None, 64])

Обратите внимание, что аргумент input_shape должен называться batch_input_shape, поскольку он включает полную форму ввода, включая размер пакета.

Метод get_weights() возвращает массив NumPy. Если вы предпочитаете получать символические тензоры, например, для непосредственного использования весов в вашей модели, вместо этого следует использовать переменную экземпляра variables:

>>> dense_layer.variables
[<tf.Variable 'kernel_5:0' shape=(64, 5) dtype=float32>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...