如何在 keras 中执行三层的加权相加?

数据挖掘 喀拉斯 张量流
2022-03-12 04:27:17

我想对来自不同 Keras 层的三个输出进行加权相加,以便权重是可训练的。我怎样才能做到这一点?我使用 tensorflow 2.0 作为 Keras 的后端。

2个回答

我在 keras 中使用子类化解决了这个问题。代码如下所示:

class Wt_Add(keras.layers.Layer):
def __init__(self, units=1, input_dim=1):
    super(Wt_Add, self).__init__()
    w_init = tf.random_normal_initializer()
    self.w1 = tf.Variable(
        initial_value=w_init(shape=(input_dim, units), dtype="float32"),
        trainable=True,
    )
    self.w2 = tf.Variable(
        initial_value=w_init(shape=(input_dim, units), dtype="float32"),
        trainable=True,
    )  
    self.w3 = tf.Variable(
        initial_value=w_init(shape=(input_dim, units), dtype="float32"),
        trainable=True,
    )       

def call(self, input1, input2, input3):
    return tf.multiply(input1,self.w1) + tf.multiply(input2, self.w2) + tf.multiply(input3, self.w3)

用法:

wt_add = Wt_Add(1,1)
sum_layer = wt_add(input1, input2, input3)

您对图层有以下基本操作:

  • tf.keras.layers.Lambda所以你可以用一个简单的 lambda 操作将你的 3 层中的每一层相乘
layer1 =  tf.keras.layers.Lambda(lambda x: x * weight1)(layer1)
layer2 =  tf.keras.layers.Lambda(lambda x: x * weight2)(layer2)
layer3 =  tf.keras.layers.Lambda(lambda x: x * weight3)(layer3)

然后是tf.keras.layers.Average允许平均层的:

average_layer = tf.keras.layers.Average()([layer1, layer2, layer3])

有点尴尬,我认为加权平均是最好的选择,但它似乎还没有在 Keras 中可用(据我所知)