我倾向于建立一个模型,该模型的一个输入是形状为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
的新张量。
那么如何实现呢?谢谢。
答案 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>]