使用Keras使用相同的神经网络进行分类和回归

时间:2019-02-23 23:35:39

标签: python keras neural-network

我想构建一个神经网络,同时输出用于分类的标签和用于回归的值。我想使用Keras做到这一点。现在,我的代码仅用于分类:

 mdl = Sequential()
 mdl.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
 mdl.add(Dense(200, activation='relu'))
 mdl.add(Dense(100, activation='relu'))
 mdl.add(Dense(6, activation='softmax'))

 mdl.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

 # early stopping implementation
 filepath="weights.best.hdf5"
 checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, 
 save_best_only=True, mode='max')
 early_stop = EarlyStopping(monitor='val_acc', patience=100, mode='max') 
 callbacks_list = [checkpoint, early_stop]


 # fit network
 history = mdl.fit(X_train, y_train, epochs=2000, batch_size=32, 
 validation_split=0.2, verbose=2, shuffle=True, callbacks=callbacks_list)

现在,我在输出层上具有softmax激活函数,该函数与我用于分类的概率相对应。我如何修改此代码以输出也代表我的回归问题的continuos值。我知道Keras Functional API允许指定多输入和多输出网络。任何对我该怎么做有想法的人吗?

1 个答案:

答案 0 :(得分:1)

相同代码的模式略有不同

您的代码可以直接转换为Keras Functional API,如其documentation所示。您需要更改顺序声明

mdl = Sequential()
mdl.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
mdl.add(Dense(200, activation='relu'))
mdl.add(Dense(100, activation='relu'))
mdl.add(Dense(6, activation='softmax'))

等效于功能:

inputs = Input(shape=(X_train.shape[1],))
layer1 = Dense(100, activation='relu')(inputs)
layer2 = Dense(200, activation='relu')(layer1)
layer3 = Dense(100, activation='relu')(layer2)
classifier = Dense(6, activation='softmax')(layer3)
mdl = Model(inputs=inputs, outputs=classifier)

(通常人们只是对所有中间层重复使用相同的变量,甚至在文档样本中也是如此,但是此恕我直言有点清楚)。

完成此操作后,可以添加另一个输出层,该输出层从最后一个密集层layer3开始“分支”,并设置模型具有两个输出,例如:

regression = Dense(1, activation='linear')(layer3)
mdl = Model(inputs=inputs, outputs=[classifier, regression])