Python 我们如何创建一个在单个模型中共享架构但在Keras中在单个模型中学习不同权重集的可重用块?

Python 我们如何创建一个在单个模型中共享架构但在Keras中在单个模型中学习不同权重集的可重用块?,python,tensorflow,keras,Python,Tensorflow,Keras,我正在使用tensorflow.keras,想知道是否有可能创建内置keras层的可重用块。例如,我希望在模型中的不同位置重复使用同一组层(能够学习不同权重)。我想在我的模型中的不同时间使用下面的块 keep_prob_=0.5 input_features=Input(shape=(29, 1664)) Imortant_features= SelfAttention(activation='tanh', kernel_regularizer=tf.keras.regularize

我正在使用tensorflow.keras,想知道是否有可能创建内置keras层的可重用块。例如,我希望在模型中的不同位置重复使用同一组层(能够学习不同权重)。我想在我的模型中的不同时间使用下面的块

keep_prob_=0.5
input_features=Input(shape=(29, 1664))
Imortant_features= SelfAttention(activation='tanh',
      kernel_regularizer=tf.keras.regularizers.l2(0.), kernel_initializer='glorot_uniform' 
     (input_features)

drop3=tf.keras.layers.Dropout(keep_prob_)(Imortant_features)
Layer_norm_feat=tf.keras.layers.Add()([input_features, drop3])
Layer_norm=tf.keras.layers.LayerNormalization(axis=-1)(Layer_norm_feat)
ff_out=tf.keras.layers.Dense(Layer_norm.shape[2], activation='relu')(Layer_norm)
ff_out=tf.keras.layers.Dense(Layer_norm.shape[2])(ff_out)
drop4=tf.keras.layers.Dropout(keep_prob_)(ff_out)
Layer_norm_input=tf.keras.layers.Add()([Layer_norm, drop4])
Attention_block_out=tf.keras.layers.LayerNormalization(axis=-1)(Layer_norm_input)
intraEpoch_att_block=tf.keras.Model(inputs=input_features, outputs=Attention_block_out)
我读过关于在Keras中创建自定义层的内容,但我觉得文档不够清晰。我想重用子模型,该子模型能够在tensorflow.keras中的单个函数API模型中学习不同的权重集。

使用此代码(我删除了SelfAttention,因此将其添加回):


下面是一些改进您的问题的建议:不客气。如果您对答案满意,请接受答案。请解释在调用函数中传递的“training=False”背后的原因?这是默认参数-以避免在评估模型时使用“training=False”调用谢谢,Andrey
import tensorflow as tf

class my_model(tf.keras.layers.Layer):
  def __init__(self):
    super(my_model, self).__init__()

    keep_prob_=0.5
    input_features=tf.keras.layers.Input(shape=(29, 1664))
    drop3=tf.keras.layers.Dropout(keep_prob_)(input_features)
    Layer_norm_feat=tf.keras.layers.Add()([input_features, drop3])
    Layer_norm=tf.keras.layers.LayerNormalization(axis=-1)(Layer_norm_feat)
    ff_out=tf.keras.layers.Dense(Layer_norm.shape[2], activation='relu')(Layer_norm)
    ff_out=tf.keras.layers.Dense(Layer_norm.shape[2])(ff_out)
    drop4=tf.keras.layers.Dropout(keep_prob_)(ff_out)
    Layer_norm_input=tf.keras.layers.Add()([Layer_norm, drop4])
    Attention_block_out=tf.keras.layers.LayerNormalization(axis=-1)(Layer_norm_input)
    self.intraEpoch_att_block=tf.keras.Model(inputs=input_features, outputs=Attention_block_out)
    
  def call(self, inp, training=False):
    x = self.intraEpoch_att_block(inp)
    return x

model1 = my_model()
model2 = my_model()