如何在Keras中实现两个神经网络的输出输入连接并共享参数
解决方案
要实现参数共享的端到端模型,核心是复用层实例而非重复定义层,避免参数独立初始化。完整实现代码如下:
import tensorflow as tf from tensorflow.keras.layers import Input, Embedding, GRU, Dense from tensorflow.keras.models import Model # 超参数定义(和你的原有参数保持一致) hidden_state = 256 embedding_size = 128 # 需确保你已提前定义好max_fr_len、max_en_len、en_vocab三个变量 # -------------------------- # 第一步:定义共享层实例,保证所有子结构共用同一套参数 # -------------------------- shared_embedding = Embedding(en_vocab, embedding_size) # 编码器专用GRU层 enc_gru1 = GRU(hidden_state, return_sequences=True) enc_gru2 = GRU(hidden_state, return_sequences=True) enc_gru3 = GRU(hidden_state, return_sequences=False) # 解码器专用GRU层 dec_gru1 = GRU(hidden_state, return_sequences=True) dec_gru2 = GRU(hidden_state, return_sequences=True) dec_gru3 = GRU(hidden_state, return_sequences=True) dec_output_dense = Dense(en_vocab, activation='softmax') # -------------------------- # 第二步:构建编码器 # -------------------------- enc_input = Input(shape=(max_fr_len,), name='enc_input') x = shared_embedding(enc_input) x = enc_gru1(x) x = enc_gru2(x) enc_output = enc_gru3(x) # -------------------------- # 第三步:构建解码器,直接传入编码器输出作为初始隐藏状态 # -------------------------- dec_input_seq = Input(shape=(max_en_len,), name='dec_input_seq') x = shared_embedding(dec_input_seq) # 三个GRU单元均使用编码器输出作为初始状态 x = dec_gru1(x, initial_state=enc_output) x = dec_gru2(x, initial_state=enc_output) x = dec_gru3(x, initial_state=enc_output) dec_output = dec_output_dense(x) # -------------------------- # 第四步:构建最终的model # -------------------------- model = Model(inputs=[enc_input, dec_input_seq], outputs=dec_output)
构建完成后可直接调用model.compile()、model.fit()进行训练,训练过程中编码器、解码器的参数会同步更新。如果后续需要单独使用编码器或者解码器做推理,直接复用上面定义的层和输入单独构建子模型即可,参数和model完全共享。
内容的提问来源于stack exchange,提问作者user11285833
相关产品推荐
相关产品推荐

