我正在使用Keras 2+8的函数式API同时解决分类和回归问题。我不知道如何从分类输出中分配标签,因为我得到的是概率。对于函数式API没有predict_classes函数。我欢迎任何建议。
def run (X_train): _input = keras.layers.Input(shape=(1024,)) hidden1=Dense(500, activation = 'elu')(_input) hidden2=Dense(300, activation = 'elu')(hidden1) classification = keras.layers.Dense(1, activation="sigmoid", name="classification")(hidden2) regression = keras.layers.Dense(1, activation="linear", name="regression")(hidden2) multi_model = keras.Model(inputs=[_input], outputs=[classification, regression]) multi_model.compile(loss={'classification': 'binary_crossentropy','regression': 'mse'}, optimizer='Nadam', metrics={'classification':'AUC', 'regression': 'mse'}) multi_model.fit([X_train, X_train], [y_train_C, y_train_R], validation_split=0.2, callbacks=callbacks, batch_size=128, epochs=500, verbose=0) return multi_model
这是我如何使用训练好的模型进行预测的:
prediction = fcfp4.predict([X_test,X_test])
我尝试使用argmax,但它只给我0值(应该为0或1)。根据评估,我应该得到非常好的分类预测:
fcfp4.evaluate([X_test,X_test], [y_test_C, y_test_R])1/1 [==============================] - 0s 998us/step - loss: 2.0826 - classification_loss: 0.0845 - regression_loss: 1.9981 - classification_auc_55: 1.0000 - regression_mean_squared_error: 1.9981
我期望得到这样的数组:
array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0])
但只得到0
回答:
要从sigmoid函数获得预测结果,您只需将预测值大于0.5的视为类别1,否则为0。以下是完整的示例:
n_sample = 100features = 1024X_train = np.random.uniform(0,1, (n_sample,features))y_train_R = np.random.uniform(0,1, n_sample)y_train_C = np.random.randint(0,2, n_sample)def run(X_train, y_train_C, y_train_R): _input = keras.layers.Input(shape=(features,)) hidden1 = keras.layers.Dense(500, activation = 'elu')(_input) hidden2 = keras.layers.Dense(300, activation = 'elu')(hidden1) classification = keras.layers.Dense(1, activation="sigmoid", name="classification")(hidden2) regression = keras.layers.Dense(1, activation="linear", name="regression")(hidden2) multi_model = keras.Model(inputs=[_input], outputs=[classification, regression]) multi_model.compile(loss={'classification': 'binary_crossentropy','regression': 'mse'}, optimizer='Nadam', metrics={'classification':'AUC', 'regression': 'mse'}) multi_model.fit(X_train, [y_train_C, y_train_R], validation_split=0.2, batch_size=128, epochs=5, verbose=1) return multi_modelmulti_model = run(X_train, y_train_C, y_train_R)prediction_class, prediction_reg = multi_model.predict(X_train)prediction_class = (prediction_class>0.5).ravel()+0