如何在keras中操纵可训练的张量乘法运算?

时间:2019-05-13 07:10:52

标签: python tensorflow keras

我倾向于建立一个模型,该模型的一个输入是形状为Weak<T>的张量。 这是模型代码中的定义:

  

history_topics =输入(形状=(29,64,),名称='history')

然后我将其转换为(?, 29, 64)形状的新张量

  

history_topics_trans = Lambda(lambda x:   K.tf.transpose(x,perm = [0,2,1]))(history_topics)

然后,我想初始化一个新的可训练张量(?,64,29),其形状为da,并将(5, 64)乘以da来获得 形状为history_topics_trans的新张量。

那么如何实现呢?谢谢。

1 个答案:

答案 0 :(得分:1)

您可以为此简单地使用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>]