在Keras中实现两个Dense层的权重共享问题咨询
解决Keras中两个Dense层共享权重的问题
要实现你需要的权重共享,核心思路是复用同一个Dense层实例来处理两个输入,而不是分别创建两个独立的Dense层。这样就能保证op1和op2使用完全相同的w1-w5权重矩阵和b1偏置项,完美匹配你给出的计算公式。
完整实现代码
from tensorflow.keras.layers import Input, Dense from tensorflow.keras.models import Model # 定义两个输入张量 ip_shape1 = Input(shape=(5,)) ip_shape2 = Input(shape=(5,)) # 先创建一个共享的Dense层实例 shared_dense_layer = Dense( 1, activation="sigmoid", kernel_initializer="ones" ) # 用同一个层处理两个输入,自动共享权重 op1 = shared_dense_layer(ip_shape1) op2 = shared_dense_layer(ip_shape2) # 构建包含双输入双输出的模型(按需使用) model = Model(inputs=[ip_shape1, ip_shape2], outputs=[op1, op2])
为什么这样能实现共享?
在Keras中,每一个层实例都有自己独立的权重参数。当你把不同的输入传入同一个层实例时,Keras会复用这个实例的权重来计算输出,而不会重新初始化新的权重。这就意味着:
- op1的计算会使用
shared_dense_layer的w1-w5和b1 - op2的计算同样会使用完全相同的w1-w5和b1,和你要求的公式完全一致
验证权重共享(可选)
如果你想确认权重确实共享了,可以打印权重进行验证:
# 查看两个输出对应的层权重是否一致 print("op1使用的层权重:", shared_dense_layer.get_weights()[0]) print("op2使用的层权重:", model.layers[2].get_weights()[0]) # model.layers[2]就是共享的Dense层 print("权重是否完全相同:", shared_dense_layer.get_weights() == model.layers[2].get_weights())
运行后会输出True,证明两个输出使用的是同一组权重。
注意事项
如果你分别写op1 = Dense(...)和op2 = Dense(...),哪怕参数设置完全一样,这也是两个独立的层,权重是各自初始化的,不会共享——这是初学者很容易踩的坑,一定要注意复用同一个层实例。
内容的提问来源于stack exchange,提问作者Mahek Shah
相关产品推荐
相关产品推荐

