使用Keras使用两个不同的输出训练相同的模型

时间:2020-04-23 15:07:09

标签: python keras activation-function

我有一个简单的GRU网络,用python用Keras编码,如下所示:

gru1  = GRU(16, activation='tanh', return_sequences=True)(input)
dense  = TimeDistributed(Dense(16, activation='tanh'))(gru1)
output = TimeDistributed(Dense(1, activation="sigmoid"))(dense)

由于我的目的是分类,因此我使用了S型激活来进行输出。但是我也需要使用相同的模型进行回归。我需要将输出激活更改为线性。但是,其余网络仍然相同。因此,在这种情况下,我将使用两个不同的网络来实现两个不同的目的。输入是相同的。但是输出是S型的类,是线性激活的类。

我的问题是,有没有办法只使用一个网络,但最后得到两个不同的输出?谢谢。

1 个答案:

答案 0 :(得分:1)

是的,您可以使用功能性API设计多输出模型。您可以保留共享层和2个不同的输出,其中一个为S形,另一个为线性激活。

注意:请勿使用input作为变量,它是python中的函数名称。

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model
seq_len = 100 # your sequence length
input_ = Input(shape=(seq_len,1))
gru1  = GRU(16, activation='tanh', return_sequences=True)(input_)
dense  = TimeDistributed(Dense(16, activation='tanh'))(gru1)
output1 = TimeDistributed(Dense(1, activation="sigmoid", name="out1"))(dense)
output2 = TimeDistributed(Dense(1, activation="linear", name="out2"))(dense)

model = Model(input_, [output1, output2])

model.summary()
Model: "model_1"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_3 (InputLayer)            [(None, 100, 1)]     0                                            
__________________________________________________________________________________________________
gru_2 (GRU)                     (None, 100, 16)      912         input_3[0][0]                    
__________________________________________________________________________________________________
time_distributed_3 (TimeDistrib (None, 100, 16)      272         gru_2[0][0]                      
__________________________________________________________________________________________________
time_distributed_4 (TimeDistrib (None, 100, 1)       17          time_distributed_3[0][0]         
__________________________________________________________________________________________________
time_distributed_5 (TimeDistrib (None, 100, 1)       17          time_distributed_3[0][0]         
==================================================================================================
Total params: 1,218
Trainable params: 1,218
Non-trainable params: 0

使用两个损失函数进行编译:

losses = {
    "out1": "binary_crossentropy",
    "out2": "mse",
}

# initialize the optimizer and compile the model

model.compile(optimizer='adam', loss=losses, metrics=["accuracy", "mae"])
相关问题