我想用 keras 为深度学习添加一对一层

I want to add one-to-one layer to deep learning with keras

我想在 Keras 的深度学习中添加特征选择层。 我写了下面的代码。

但是,我在输入层之后还需要一个一对一的线性层。 我知道我不能使用 Dense 层,但我应该如何使用代码?

input_layer = Input(shape=(len(input_df.columns),), dtype='float')
modelx_1 = Dense(64)(input_layer)
modelx_1 = Activation("relu")(modelx_1)
modelx_1 = Dropout(0.2)(modelx_1)
modelx_2 = Dense(16)(modelx_1)
modelx_2 = Activation("linear")(modelx_2)
modelx_2 = Dropout(0.2)(modelx_2)
modelx_2 = Dense(1)(modelx_2)
modely_1 = Dense(64)(input_layer)
modely_1 = Activation("relu")(modely_1)
modely_1 = Dropout(0.2)(modely_1)
modely_2 = Dense(16)(modely_1)
modely_2 = Activation("linear")(modely_2)
modely_2 = Dropout(0.2)(modely_2)
modely_2 = Dense(1)(modely_2)

output_layer = Concatenate()([modelx_2, modely_2])
model = Model(inputs=input_layer, outputs=output_layer)

这是我的目标深度学习架构。 (https://www.researchgate.net/publication/271329170_Deep_feature_selection_Theory_and_application_to_identify_enhancers_and_promoters)

如果您不介意,请告诉我。

我不确定您提供的代码片段是否与图像中显示的预期架构匹配,因为您的代码片段中有多个输出,但显示的图像中只有 1 个输出和 3 个单元,或者我可能遗漏了一些东西。

我的答案将用于定义图像上显示的架构。


你有几种方法可以做到,第一个问题是:加权输入层的权重是可训练的还是恒定的?

  1. 如果权重不变,您有 2 个解决方案:

1.1。用权重定义一个常量张量并用它来乘以输入特征:

import tensorflow as tf

n_features = 4
weights = tf.constant([1.1, 1.2, 1.3, 1.4])


input_ = tf.keras.layers.Input(shape=(n_features,))
input_weighted = tf.multiply(input_, weights)
dense_1 = tf.keras.layers.Dense(units=5, activation="relu")(input_weighted)
dense_2 = tf.keras.layers.Dense(units=4, activation="relu")(dense_1)
output = tf.keras.layers.Dense(units=3, activation="softmax")(dense_2)

model = tf.keras.Model(inputs=input_, outputs=output)

tf.keras.utils.plot_model(model, show_shapes=True)

这为您提供了以下模型:

1.2。使用输入层提供权重

import tensorflow as tf

n_features = 4

input_ = tf.keras.layers.Input(shape=(n_features,))
weights = tf.keras.layers.Input(shape=(n_features,))
input_weighted = tf.keras.layers.Multiply(name="weighted_input")([input_, weights])
dense_1 = tf.keras.layers.Dense(units=5, activation="relu")(input_weighted)
dense_2 = tf.keras.layers.Dense(units=4, activation="relu")(dense_1)
output = tf.keras.layers.Dense(units=3, activation="softmax")(dense_2)

model = tf.keras.Model(inputs=[input_, weights], outputs=output)

tf.keras.utils.plot_model(model, show_shapes=True)

这为您提供了以下模型:

  1. 如果权重是可训练的,您可以创建一个自定义层并在您的模型中使用它
import tensorflow as tf

class WeightedLayer(tf.keras.layers.Layer):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    
    def build(self, input_shape):
        self.kernel = self.add_weight("kernel", shape=(int(input_shape[-1]),))
    
    def call(self, inputs):
        return tf.multiply(inputs, self.kernel)

n_features = 4

input_ = tf.keras.layers.Input(shape=(n_features,))
input_weighted = WeightedLayer(name="weighted_input")(input_)
dense_1 = tf.keras.layers.Dense(units=5, activation="relu")(input_weighted)
dense_2 = tf.keras.layers.Dense(units=4, activation="relu")(dense_1)
output = tf.keras.layers.Dense(units=3, activation="softmax")(dense_2)

model = tf.keras.Model(inputs=input_, outputs=output)

tf.keras.utils.plot_model(model, show_shapes=True)

这为您提供了以下模型:


通过每次打印模型摘要,您可以看到前两个模型有 64 个可训练参数,最后一个模型有 68 个可训练参数,对应于前两个模型的 64 个 + 4 个权重