请教: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
相关产品推荐
相关产品推荐

