【发布时间】: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