【问题标题】:How to label the loss values in Keras binary-crossentropy model如何在 Keras 二元交叉熵模型中标记损失值
【发布时间】:2020-09-30 23:15:20
【问题描述】:

我的数据 X 有一个 keras 模型。使用的代码是:

X=np.array(data[['tags1','prx1','prxcol1','p1','p2','p3']].values)
t=np.array(data.read.values)
n=np.array(data.read.values)

import keras

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 
import tensorflow as tf

from sklearn.model_selection import train_test_split
X_train, X_test, t_train, t_test =  train_test_split(X, t, test_size=0.2)

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler

standard_transformer = Pipeline(steps=[
        ('standard', StandardScaler())])

minmax_transformer = Pipeline(steps=[
        ('minmax', MinMaxScaler())])

preprocessor = ColumnTransformer(
        remainder='passthrough', #passthough features not listed
        transformers=[
            ('std', standard_transformer , []),
            ('mm', minmax_transformer , slice(1,9))
        ])

X_train = preprocessor.fit_transform(X_train)
X_test = preprocessor.transform(X_test)

model = keras.models.Sequential([
    keras.layers.Dense(20, activation="tanh", input_shape=X_train.shape[1:]),
    keras.layers.Dense(1, activation="sigmoid")
])

model.summary

try: 
    model = keras.models.load_model("modelrfidX1.h5") # cargar modelo
except:
    pass

early_stopping_cb = keras.callbacks.EarlyStopping(patience=100, restore_best_weights=True)
checkpoint_cb = keras.callbacks.ModelCheckpoint("modelrfidX1.h5", save_best_only=True)

model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
history = model.fit(X_train, t_train, epochs=50000, 
                    validation_data=(X_test, t_test), 
                    callbacks=[checkpoint_cb, early_stopping_cb])

print(history.params)

它显示的历史值是这样的:

Epoch 164/50000
26320/26320 [==============================] - 1s 44us/step - loss: 0.2543 - accuracy: 0.8786 - val_loss: 0.2692 - val_accuracy: 0.8669
Epoch 165/50000
26320/26320 [==============================] - 1s 39us/step - loss: 0.2541 - accuracy: 0.8790 - val_loss: 0.2621 - val_accuracy: 0.8705
Epoch 166/50000
26320/26320 [==============================] - 1s 39us/step - loss: 0.2548 - accuracy: 0.8782 - val_loss: 0.2658 - val_accuracy: 0.8701
Epoch 167/50000
26320/26320 [==============================] - 1s 39us/step - loss: 0.2541 - accuracy: 0.8782 - val_loss: 0.2686 - val_accuracy: 0.8673
Epoch 168/50000
26320/26320 [==============================] - 1s 40us/step - loss: 0.2534 - accuracy: 0.8780 - val_loss: 0.2651 - val_accuracy: 0.8684
Epoch 169/50000
26320/26320 [==============================] - 1s 39us/step - loss: 0.2552 - accuracy: 0.8778 - val_loss: 0.2645 - val_accuracy: 0.8689
Epoch 170/50000
26320/26320 [==============================] - 1s 40us/step - loss: 0.2554 - accuracy: 0.8766 - val_loss: 0.2620 - val_accuracy: 0.8711
Epoch 171/50000
26320/26320 [==============================] - 1s 40us/step - loss: 0.2538 - accuracy: 0.8779 - val_loss: 0.2777 - val_accuracy: 0.8611

我代表lossval_loss 数字相对于Epoch,但我不知道应该如何准确地标记这些损失的y 轴以及它们的单位。我假设损失措施binary-crossentropy y 轴标签应该是 H 和单位 [bits] 但我想确定。 我一直在 keras 文档和研究论文中搜索,但仍然不知道如何标记 y 轴。

【问题讨论】:

    标签: tensorflow keras neural-network cross-entropy


    【解决方案1】:

    通常用于训练神经网络的损失函数通常是代理损失函数,这意味着它们不是您要优化的实际指标。使用代理损失函数是因为您尝试优化的指标通常是不可微的。例如,二元交叉熵是分类错误的替代损失函数,它不会像神经网络的权重那样平滑变化。

    损失函数没有有意义的单位,它的值也没有多大意义。您无法真正将一个问题上的损失函数值与另一个问题进行比较。损失函数图实际上只对显示学习趋势有用(这就是为什么该图被称为学习曲线)。由于它们只显示趋势,因此通常不显示单位。

    如果您想生成一个带有单位的图表,您应该生成一个您尝试优化的主要指标的图表。对于二元交叉熵示例,这可能是分类准确度或错误(百分比)。

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2021-09-12
      • 2019-07-13
      • 2020-12-08
      • 2019-08-08
      • 1970-01-01
      • 2018-09-12
      • 2018-11-03
      • 2022-11-18
      相关资源
      最近更新 更多