You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:03