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

请教:Keras单隐藏层双输出回归网络分设激活函数的搭建是否正确?

问题分析与正确实现方式

你的当前写法是错误的。在Dense(units=2)之后连续添加两个Activation层,会让两个激活函数依次作用于整个输出层的所有神经元——也就是先把两个输出神经元的结果都经过tanh激活,再把这两个结果都经过sigmoid激活,完全达不到“给每个输出神经元分配独立激活函数”的目的。

由于Sequential模型是线性层堆叠结构,无法实现单个输出神经元的独立激活逻辑,你需要改用Keras的函数式API来构建这种多输出且每个输出带独立激活的模型,具体实现如下:

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Activation
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import initializers

# 保留你的参数设置
n_epoch = 1000 
hidden_layer1_neurons = 100
learning_rate = 0.01
batch_size = 2000
activation_1 = 'relu'   # 隐藏层激活函数
activation_2 = 'tanh'   # 第一个输出的激活函数
activation_3 = 'sigmoid'# 第二个输出的激活函数
min_lr = 0.008
lr_reduce_patience = 10
earlystop_patience = 100 
earlystop_min_delta = 0.0001 

# 用函数式API构建模型
input_layer = Input(shape=(input_dim,))
# 隐藏层
hidden_layer = Dense(units=hidden_layer1_neurons, 
                     kernel_initializer=initializers.RandomNormal(mean=0.0, stddev=0.05))(input_layer)
hidden_layer = Activation(activation_1)(hidden_layer)

# 构建两个独立的输出分支,每个分支对应一个输出目标
output1 = Dense(units=1)(hidden_layer)
output1 = Activation(activation_2)(output1)

output2 = Dense(units=1)(hidden_layer)
output2 = Activation(activation_3)(output2)

# 定义完整模型
model = Model(inputs=input_layer, outputs=[output1, output2])

# 编译模型:双输出需指定每个输出的损失函数(回归任务均用MSE)
model.compile(optimizer=Adam(learning_rate=learning_rate),
              loss=['mean_squared_error', 'mean_squared_error'],
              metrics=['mae'])

训练注意事项

你的训练生成器training_generator和验证生成器validation_generator需要返回包含输入特征与两个目标值的结构,即每次迭代返回(X, [y1, y2]),其中y1对应第一个输出的标签,y2对应第二个输出的标签,这样模型才能正确匹配双输出进行训练。

内容的提问来源于stack exchange,提问作者bluered_earth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:40:25