You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 20:27:02