首页 > 解决方案 > 带有 keras/scikit-learn 的简单分类器神经网络的平面输出向量

问题描述

我想为一个简单的分类问题构建一个简单的神经网络。我刚刚发现了 keras/scikit-learn 包装类,但行为并不完全符合预期。

from keras.wrappers.scikit_learn import KerasClassifier

期望网络的KerasClassifier构建功能:

def build_perceptron():
    net = keras.models.Sequential(
        [
            keras.layers.Dense(10, input_dim=4, activation="relu", kernel_initializer='random_uniform'),
            keras.layers.Dense(1, activation="sigmoid"),
        ]
    )
    net.compile(
        optimizer="adam",
        loss="binary_crossentropy",
        metrics=["binary_accuracy"]
    )
    return net

现在我可以按如下方式使用它:

model = KerasClassifier(
    build_fn=build_perceptron,
    epochs=100, 
    batch_size=5,
)

网络学习完美分类。然而,预测具有形状(n_samples, 1)而不是(n_samples,)scikit-learn 的预期:

y_pred = model.predict(X_test)

array([[1],
       [0],
       [1],
       [1],
       [0],
       [1], 

我尝试使用 scikit-learn 函数并为 F1 大约为 1.0 的分类器获得了 0.0 F1 分数。

cross_val_score(
    KerasClassifier(
        build_fn=build_perceptron,
        epochs=100, 
        batch_size=5,
    ),
    X=X,
    y=y,
    scoring=make_scorer(f1_score, greater_is_better=True),
)

我是否需要以不同的方式配置网络以获得正确的输出形状?

这有点令人困惑,因为训练标签是一维向量并且没有关于形状的抱怨。

标签: pythontensorflowmachine-learningkerasneural-network

解决方案


推荐阅读