如何在TensorFlow中实现输入层到非相邻隐藏层的额外连接并配置不同初始化规则
TensorFlow自定义跨层连接网络实现方案
你提到的跨层连接需求完全可以实现,原有Sequential模型仅支持线性堆叠的网络结构,无法实现跳连,换成Keras函数式API即可灵活定义任意拓扑结构的网络,同时支持为不同连接单独配置权重初始化规则。
你想要实现的网络结构如下:
完整可运行的实现代码如下,和你原有代码逻辑完全兼容:
import numpy as np import tensorflow as tf from tensorflow import keras m = 200 n = 5 my_input= np.random.random([m,n]) my_output = np.random.random([m,1]) # 定义输入张量 inputs = keras.Input(shape=(my_input.shape[1],)) flatten_input = keras.layers.Flatten()(inputs) # 第一层、第二层按原有逻辑实现,权重统一用GlorotNormal初始化 layer1 = keras.layers.Dense(32, activation='softmax', kernel_initializer='GlorotNormal')(flatten_input) layer2 = keras.layers.Dense(32, activation='tanh', kernel_initializer='GlorotNormal')(layer1) # 第三层ReLU层单独处理两个来源的输入 # 来自上一层(第二层)的连接,使用GlorotNormal初始化,保留偏置项 from_prev_layer = keras.layers.Dense(32, kernel_initializer='GlorotNormal', use_bias=True)(layer2) # 来自输入层的跳连,使用HeUniform初始化,关闭偏置避免重复添加(可按需调整) from_input_skip = keras.layers.Dense(32, kernel_initializer='HeUniform', use_bias=False)(flatten_input) # 两部分线性变换结果相加后过ReLU激活 layer3 = keras.layers.ReLU()(from_prev_layer + from_input_skip) # 输出层和原有逻辑一致 outputs = keras.layers.Dense(1)(layer3) # 组装模型 my_model = keras.Model(inputs=inputs, outputs=outputs) # 编译、训练逻辑保持不变 my_model.compile(loss='mse',optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)) res = my_model.fit(my_input, my_output, epochs=50, batch_size=1,verbose=0)
关键逻辑说明
- 我们通过两个独立的
Dense层分别处理第二层输出和原始输入的线性变换,这样可以单独为两类连接配置不同的权重初始化规则 - 如果需要调整为拼接输入而非加和的逻辑,可将加和操作替换为
keras.layers.Concatenate()([from_prev_layer, from_input_skip]),再传入Dense层即可 - 跳连的
Dense层是否保留偏置可以根据实际需求调整,示例中关闭是为了避免同一层出现两个偏置项
内容的提问来源于stack exchange,提问作者whitepanda
相关产品推荐
相关产品推荐

