0

我目前正在使用 Keras 的功能 API 和具有多个自变量和单个分类目标变量的数据集使用以下代码构建神经网络模型。

input_layer = keras.Input(shape=(89,), name="input_layer")
dense_1 = keras.layers.Dense(50, name = 'dense_1')(input_layer)
dense_2 = keras.layers.Dense(50, name = 'dense_2')(dense_1)
classification_output_1 = keras.layers.Dense(31, activation = 'softmax', name = 'classification_output_1')(dense_2)
model = keras.Model(inputs = input_layer, outputs = [regression_output_1, classification_output_1])


model.compile(
    optimizer = "adam",
    loss = 'sparse_categorical_crossentropy'
)

model_1 = model.fit(
    X_train,
    y_train["Category_Target"],
    epochs = 10,
    batch_size = 50,
    verbose = 1
)

y_pred = model_1.predict(X_train)
y_pred = pd.DataFrame(y_pred[0])
y_pred.columns = [i for i in pd.get_dummies(y_train["Category_Target"]).columns]

由于 y_pred 是单热向量的形式,我认为使用 pd.get_dummies().columns 可以获得我需要的类标签。我的问题是,这种方法是否可靠,如果不可靠,是否有任何其他方法可以获取预测值的类标签?获取类标签的旧方法(即 predict_classes)已被弃用,我真的找不到可靠的方法来获取它们。我还考虑了其​​他方法,例如:

y_pred.columns = list(y_train.drop_duplicates(by = "Category_Target")["Category_Target"])

我尝试过的两种方法似乎都不是正确标记类的可靠方法

4

1 回答 1

1

这是从一组标签和带有这些标签的字符串数组来回的往返示例。

idx_to_labels = ['lions','tigers','bears']

target_strings = ['tigers','lions','lions','bears']

target_idx = tf.constant([labels.index(x) for x in target_labels], dtype=tf.int64)

target_one_hot = keras.utils.to_categorical(target_idx)

# this is the idiomatic way of going from one-hot to index
recovered_target_idx = tf.argmax(target_one_hot, axis=-1)

# if you have an ordered label list, this is a quick way to map a list with the integers back to strings
recovered_target_labels = [idx_to_labels[x] for x in  recovered_target_idx.numpy()]

如果您的目标是 one-hot 编码,那么您需要使用CategoricalCrossentropy损失。 SparseCrossentropy期望目标是索引(在我上面的示例中,就像target_idx变量一样。如果您的评估结果很差,这可能是根本原因。

https://keras.io/api/losses/probabilistic_losses/#categoricalcrossentropy-function

于 2021-10-26T12:36:57.070 回答