Вы можете просто использовать слой 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>]