gpt4 book ai didi

python - 如何在 Keras Dense 层中共享权重而不是偏差

转载 作者:行者123 更新时间:2023-12-04 12:37:40 27 4
gpt4 key购买 nike

我正在尝试为序数回归创建一个模型,正如这个 paper 所解释的那样.它的主要部分是在最后一层共享权重,而不是为了获得秩单调性的偏差(基本上确保 P[Y>N] 必须始终大于 P[Y>N-1] 对于任何这样的 N) .这对我来说是非常可取的,因为我有几个值,但我仍然希望得到它们的概率。到目前为止,我已经实现了它编码数字的方式,并且没有等级单调性,因为有时 P(Y>5) > P(Y>4) 的概率。

如何在 Keras 中实现权重共享而不是偏差共享?我知道函数式 API 有一种共享权重和偏差的方法,但这在这种情况下无济于事。感谢任何可以提供帮助的人。

编辑:在 N 个神经元的一层内和 N 个层之间共享权重但不共享偏置将解决问题。此外,我认为将 Dense() 中的 use_bias 参数设置为 false 并创建某种自定义的 Bias 层也可以解决问题,但我不知道该怎么做

我认为六个神经元和五个输入的方程是这样的

op1 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b1
op2 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b2
op3 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b3
op4 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b4
op5 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b5
op6 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b6

其中 w1 到 w5 是权重,z1 到 z5 是输入,b1 到 b6 是偏置项

最佳答案

实现此目的的方法之一是定义自定义 bias层,这是你如何做到这一点。
PS:根据需要更改输入形状/初始值设定项。

import tensorflow as tf
print('TensorFlow:', tf.__version__)

class BiasLayer(tf.keras.layers.Layer):
def __init__(self, units, *args, **kwargs):
super(BiasLayer, self).__init__(*args, **kwargs)
self.bias = self.add_weight('bias',
shape=[units],
initializer='zeros',
trainable=True)

def call(self, x):
return x + self.bias

z1 = tf.keras.Input(shape=[1])
z2 = tf.keras.Input(shape=[1])
z3 = tf.keras.Input(shape=[1])
z4 = tf.keras.Input(shape=[1])
z5 = tf.keras.Input(shape=[1])

dense_layer = tf.keras.layers.Dense(units=10, use_bias=False)


op1 = BiasLayer(units=10)(dense_layer(z1))
op2 = BiasLayer(units=10)(dense_layer(z2))
op3 = BiasLayer(units=10)(dense_layer(z3))
op4 = BiasLayer(units=10)(dense_layer(z4))
op5 = BiasLayer(units=10)(dense_layer(z5))

model = tf.keras.Model(inputs=[z1, z2, z3, z4, z5], outputs=[op1, op2, op3, op4, op5])
model.summary()

输出:
TensorFlow: 2.1.0-dev20200107
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
input_2 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
input_3 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
input_4 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
input_5 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
dense (Dense) (None, 10) 10 input_1[0][0]
input_2[0][0]
input_3[0][0]
input_4[0][0]
input_5[0][0]
__________________________________________________________________________________________________
bias_layer (BiasLayer) (None, 10) 10 dense[0][0]
__________________________________________________________________________________________________
bias_layer_1 (BiasLayer) (None, 10) 10 dense[1][0]
__________________________________________________________________________________________________
bias_layer_2 (BiasLayer) (None, 10) 10 dense[2][0]
__________________________________________________________________________________________________
bias_layer_3 (BiasLayer) (None, 10) 10 dense[3][0]
__________________________________________________________________________________________________
bias_layer_4 (BiasLayer) (None, 10) 10 dense[4][0]
==================================================================================================
Total params: 60
Trainable params: 60
Non-trainable params: 0
__________________________________________________________________________________________________

关于python - 如何在 Keras Dense 层中共享权重而不是偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59656313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com