【问题标题】:Tensorflow 2: Customized Loss Function works differently from the original Keras SparseCategoricalCrossentropyTensorflow 2:自定义损失函数与原始 Keras SparseCategoricalCrossentropy 的工作方式不同
【发布时间】:2020-04-03 17:23:37
【问题描述】:

我刚开始使用 tensorflow 2.0,并按照其官方网站上的简单示例进行操作。

import tensorflow as tf
import tensorflow.keras.layers as layers

mnist = tf.keras.datasets.mnist
(t_x, t_y), (v_x, v_y) = mnist.load_data()

model = tf.keras.Sequential()
model.add(layers.Flatten())
model.add(layers.Dense(128, activation="relu"))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(10))

lossFunc = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

model.compile(optimizer='adam', loss=lossFunc,
              metrics=['accuracy'])
model.fit(t_x, t_y, epochs=5)

上述代码的输出是:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 4s 60us/sample - loss: 2.5368 - accuracy: 0.7455
Epoch 2/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.5846 - accuracy: 0.8446
Epoch 3/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.4751 - accuracy: 0.8757
Epoch 4/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.4112 - accuracy: 0.8915
Epoch 5/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.3732 - accuracy: 0.9018

但是,如果我将 lossFunc 更改为以下内容:

def myfunc(y_true, y_pred):
    return lossFunc(y_true, y_pred)

它只是简单地包装了前一个函数,它的执行方式完全不同。输出为:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 4s 60us/sample - loss: 2.4444 - accuracy: 0.0889
Epoch 2/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.5696 - accuracy: 0.0933
Epoch 3/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.4493 - accuracy: 0.0947
Epoch 4/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.4046 - accuracy: 0.0947
Epoch 5/5
60000/60000 [==============================] - 3s 51us/sample - loss: 0.3805 - accuracy: 0.0943

损失值非常相似,但准确度值完全不同。任何人都知道它有什么魔力,编写自己的损失函数的正确方法是什么?

【问题讨论】:

  • 损失似乎没有太大变化。这可能与您如何应用指标有关。您可以在应用自定义损失时分享代码部分吗?
  • 很简单。只需将损失函数替换为新函数即可。 ``` model.compile(optimizer='adam', loss=myfunc, metrics=['accuracy']) ``` 其余代码完全相同。安装 tensorflow 2 后,上面的代码很容易运行。

标签: tensorflow machine-learning keras deep-learning loss


【解决方案1】:

当您使用内置损失函数时,您可以使用 'accuracy' 作为 metric 。在幕后,tensorflow 将选择适当的精度函数(在您的情况下是tf.keras.metrics.SparseCategoricalAccuracy())。

当你定义 custom_loss 函数时,tensorflow 不知道使用哪个精度函数。在这种情况下,您需要明确指定它是tf.keras.metrics.SparseCategoricalAccuracy()。请查看gist hub gist here

代码修改及输出如下

model2 = tf.keras.Sequential()
model2.add(layers.Flatten())
model2.add(layers.Dense(128, activation="relu"))
model2.add(layers.Dropout(0.2))
model2.add(layers.Dense(10))

lossFunc = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

model2.compile(optimizer='adam', loss=myfunc,
              metrics=['accuracy',tf.keras.metrics.SparseCategoricalAccuracy()])
model2.fit(t_x, t_y, epochs=5)

输出

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 5s 81us/sample - loss: 2.2295 - accuracy: 0.0917 - sparse_categorical_accuracy: 0.7483
Epoch 2/5
60000/60000 [==============================] - 5s 76us/sample - loss: 0.5827 - accuracy: 0.0922 - sparse_categorical_accuracy: 0.8450
Epoch 3/5
60000/60000 [==============================] - 5s 76us/sample - loss: 0.4602 - accuracy: 0.0933 - sparse_categorical_accuracy: 0.8760
Epoch 4/5
60000/60000 [==============================] - 5s 76us/sample - loss: 0.4197 - accuracy: 0.0946 - sparse_categorical_accuracy: 0.8910
Epoch 5/5
60000/60000 [==============================] - 5s 76us/sample - loss: 0.3965 - accuracy: 0.0937 - sparse_categorical_accuracy: 0.8979
<tensorflow.python.keras.callbacks.History at 0x7f5095286780>

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 2017-12-29
    • 2021-04-03
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2020-12-19
    • 2017-12-18
    相关资源
    最近更新 更多