繁体   English   中英

在 Keras 中获取多输出 model 的类

[英]Get classes for multi-output model in Keras

我正在利用 Keras 2+8 功能 API 同时解决分类和回归问题。 我不知道如何从分类 output 中分配标签,因为我得到了概率。 功能 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

这就是我使用训练有素的 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 获得预测,您只需将其视为 class 1,如果 pred 高于 0.5,否则为 0。这里是完整示例

n_sample = 100
features = 1024
X_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_model

multi_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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM