TensorFlow2.0(8):誤差計算——損失函數總結

2021-02-21 機器學習算法與Python實戰
1 均方差損失函數:MSE

均方誤差(Mean Square Error),應該是最常用的誤差計算方法了,數學公式為:

其中,是真實值,是預測值,通常指的是batch_size,也有時候是指特徵屬性個數。

import tensorflow as tfy = tf.random.uniform((5,),maxval=5,dtype=tf.int32)  # 假設這是真實值print(y)
y = tf.one_hot(y,depth=5) # 轉為熱獨編碼print(y)

tf.Tensor([2 4 4 0 2], shape=(5,), dtype=int32)
tf.Tensor(
[[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0.]], shape=(5, 5), dtype=float32)

<tf.Tensor: id=7, shape=(5, 5), dtype=float32, numpy=
array([[0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1.],
[0., 0., 0., 0., 1.],
[1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0.]], dtype=float32)>

pred = tf.random.uniform((5,),maxval=5,dtype=tf.int32)  # 假設這是預測值pred = tf.one_hot(pred,depth=5)  # 轉為熱獨編碼print(pred)

tf.Tensor(
[[0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]], shape=(5, 5), dtype=float32)

loss1 = tf.reduce_mean(tf.square(y-pred))loss1

<tf.Tensor: id=19, shape=(), dtype=float32, numpy=0.4>

在tensorflow的losses模塊中,提供能MSE方法用於求均方誤差,注意簡寫MSE指的是一個方法,全寫MeanSquaredError指的是一個類,通常通過方法的形式調用MSE使用這一功能。MSE方法返回的是每一對真實值和預測值之間的誤差,若要求所有樣本的誤差需要進一步求平均值:

loss_mse_1 = tf.losses.MSE(y,pred)loss_mse_1

<tf.Tensor: id=22, shape=(5,), dtype=float32, numpy=array([0.4, 0.4, 0.4, 0.4, 0.4], dtype=float32)>

loss_mse_2 = tf.reduce_mean(loss_mse_1)loss_mse_2

<tf.Tensor: id=24, shape=(), dtype=float32, numpy=0.4>

一般而言,均方誤差損失函數比較適用於回歸問題中,對於分類問題,特別是目標輸出為One-hot向量的分類任務中,下面要說的交叉熵損失函數就要合適的多。

2 交叉熵損失函數

交叉熵(Cross Entropy)是資訊理論中一個重要概念,主要用於度量兩個概率分布間的差異性信息,交叉熵越小,兩者之間差異越小,當交叉熵等於0時達到最佳狀態,也即是預測值與真實值完全吻合。先給出交叉熵計算公式:

其中,是真實分布的概率,是模型通過數據計算出來的概率估計。

不理解?沒關係,我們通過一個例子來說明。假設對於一個分類問題,其可能結果有5類,由表示,有一個樣本,其真實結果是屬於第2類,用One-hot編碼表示就是,也就是上面公司中的。現在有兩個模型,對樣本的預測結果分別是 和 ,也就是上面公式中的。從直覺上判斷,我們會認為第一個模型預測要準確一些,因為它更加肯定屬於第二類,不過,我們需要通過科學的量化分析對比來證明這一點:

第一個模型交叉熵:

第二個模型交叉熵:

可見,,所以第一個模型的結果更加可靠。

在TensorFlow中,計算交叉熵通過tf.losses模塊中的categorical_crossentropy()方法。

tf.losses.categorical_crossentropy([0,1,0,0,0],[0.1, 0.7, 0.05, 0.05, 0.1])

<tf.Tensor: id=41, shape=(), dtype=float32, numpy=0.35667497>

tf.losses.categorical_crossentropy([0,1,0,0,0],[0, 0.6, 0.2, 0.1, 0.1])

<tf.Tensor: id=58, shape=(), dtype=float32, numpy=0.5108256>

模型在最後一層隱含層的輸出可能並不是概率的形式,不過可以通過softmax函數轉換為概率形式輸出,然後計算交叉熵,但有時候可能會出現不穩定的情況,即輸出結果是NAN或者inf,這種情況下可以通過直接計算隱藏層輸出結果的交叉熵,不過要給categorical_crossentropy()方法傳遞一個from_logits=True參數。

x = tf.random.normal([1,784])w = tf.random.normal([784,2])b = tf.zeros([2])

logits = x@w + b  # 最後一層沒有激活函數的層稱為logits層logits

<tf.Tensor: id=75, shape=(1, 2), dtype=float32, numpy=array([[ 5.236802, 18.843138]], dtype=float32)>

prob = tf.math.softmax(logits, axis=1)  # 轉換為概率的形式prob

<tf.Tensor: id=77, shape=(1, 2), dtype=float32, numpy=array([[1.2326591e-06, 9.9999881e-01]], dtype=float32)>

tf.losses.categorical_crossentropy([0,1],logits,from_logits=True)  # 通過logits層直接計算交叉熵

<tf.Tensor: id=112, shape=(1,), dtype=float32, numpy=array([1.1920922e-06], dtype=float32)>

tf.losses.categorical_crossentropy([0,1],prob)  # 通過轉換後的概率計算交叉熵

<tf.Tensor: id=128, shape=(1,), dtype=float32, numpy=array([1.1920936e-06], dtype=float32)>

相關焦點

  • TensorFlow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。
  • Tensorflow 2.0 即將入場
    而就在即將到來的2019年,Tensorflow 2.0將正式入場,給暗流湧動的框架之爭再燃一把火。如果說兩代Tensorflow有什麼根本不同,那應該就是Tensorflow 2.0更注重使用的低門檻,旨在讓每個人都能應用機器學習技術。
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    examples = " + str(X_test.shape[1]))print ("X_train shape: " + str(X_train.shape))print ("Y_train shape: " + str(Y_train.shape))print ("X_test shape: " + str(X_test.shape))print ("Y_test shape: " + str
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    僅使用具有自定義損失功能且具有平方誤差損失的普通Keras。該網絡是3個密集層的深層網絡。損失函數:可以在損失函數定義中獲得所有想要的技巧,而Keras不會因為其_standarize_user_data(link)報錯。漸變:可以訪問漸變,並定義前進和後退通道的細節。指標是使用新tf.keras.metrics API指定的。
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    按照順序閱讀下列腳本:serial.pytensor.pybigdata.pySerial.py這個腳本的目的是說明 TensorFlow 模型的基本要點。這個腳本使你更容易理解模型是如何組合在一起的。我們使用 for 循環來定義數據與線之間的誤差。由於定義誤差的方式為循環,該腳本以序列化(串行)計算的方式運行。
  • 步履不停:TensorFlow 2.4新功能一覽!
    Keras 混合精度 API        https://tensorflow.google.cn/api_docs/python/tf/keras/mixed_precision如要使用混合精度 API,您必須使用 Keras 層和優化工具,但無需使用其他 Keras 類,例如模型或損失。
  • 5個簡單的步驟掌握Tensorflow的Tensor
    ] ]rank_3_tensor = tf.constant(three_level_nested_list)print(rank_3_tensor)Output:tf.Tensor( [[[ 0 1 2] [ 3 4 5]] [[ 6 7 8] [ 9 10 11]]], shape=(2, 2,
  • 【強化學習實戰】基於gym和tensorflow的強化學習算法實現
    qlearning 算法的測試在文件learning_and_test.py中  第2小節:基於策略梯度算法實現詳解  該部分需要用到tensorflow和畫圖庫,所以大家先安裝一下cpu版的tensorflow。
  • 作為TensorFlow的底層語言,你會用C++構建深度神經網絡嗎?
    ,deps = ["//tensorflow/cc:gradients","//tensorflow/cc:grad_ops","//tensorflow/cc:cc_ops","//tensorflow/cc:client_session","//tensorflow/core:tensorflow"
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • TensorFlow 2入門指南,初學者必備!
    from sklearn.model_selection import train_test_split #to split dataimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport tensorflow as tffrom te
  • 關於TensorFlow 2.0,這裡有你想知道的一切
    Tensorflow 2.0代碼示例TensorFlow 2.0代碼看起來很像NumPy代碼。事實上,TensorFlow和NumPy的對象可以很容易地切換。因此不必擔心佔位符、會話、feed_dictionaties等問題。2.
  • 這裡有一份TensorFlow2.0中文教程
    今年 3 月份,谷歌在 Tensorflow Developer Summit 2019 大會上發布 TensorFlow 2.0 Alpha 版。作為當前最為流行的深度學習框架,2.0 Alpha 版的正式發布引人關注。近兩個月,網上已經出現了大量 TensorFlow 2.0 英文教程。在此文章中,機器之心為大家推薦一個持續更新的中文教程,以便大家學習。
  • Tensorflow基礎教程15天之創建Tensor
    序列TensorTensorflow允許我們定義數組Tensor。runcnorm_tsr = tf.truncated_normal([row_dim, col_dim],mean=0.0, stddev=1.0)也許我們會對洗牌數組感興趣。可以通過random_shuffle()和random_crop()這個兩個函數來完成。
  • TensorFlow 2.0開源工具書,30天「無痛」上手
    有人在 GitHub 開源了一個名為《30 天吃掉那隻 TensorFlow2.0》的入門工具書,或許可以讓你無痛上手 TensorFlow 2.0。開源電子書地址:https://lyhue1991.github.io/eat_tensorflow2_in_30_days/GitHub 項目地址:https://github.com/lyhue1991/eat_tensorflow2_in_30_days為什麼一定要學
  • 資源| TensorFlow版本號升至1.0,正式版即將到來
    發布地址官網:https://www.tensorflow.org/versions/r1.0/GitHub:https://github.com/tensorflow/tensorflow/releases主要特性和提升TensorFlow Debugger (tfdbg):命令行接口和 API增加新的 python 3 docker 鏡像使
  • 入門| Tensorflow實戰講解神經網絡搭建詳細過程
    所謂的獨熱編碼,直觀的講就是用N個維度來對N個類別進行編碼,並且對於每個類別,只有一個維度有效,記作數字1 ;其它維度均記作數字0。例如類標1表示為:([0,1,0,0,0,0,0,0,0,0]);同理標籤2表示為:([0,0,1,0,0,0,0,0,0,0])。最後我們通過softmax函數輸出的是每張圖片屬於10個類別的概率。
  • 終於來了,TensorFlow 新增官方 Windows 支持
    隨著 TensorFlow r0.12 版的發布,這一開源軟體庫現已支持 Windows7、10 和 Server 2016。同時,這一新版本可以讓用戶在 TensorFlow 訓練中得到 CUDA 8 的 GPU 加速。我們已將新版本在 PyPI 中封裝成型。現在你可以使用命令 C:\> pip install tensorflow 安裝 TensorFlow 了。
  • 機器之心GitHub項目:從零開始用TensorFlow搭建卷積神經網絡
    conda 環境: activate tensorflow 運行後會變為「(tensorflow) C:Users用戶名>」,然後我們就可以繼續在該 conda 環境內安裝 TensorFlow(本文只使用 CPU 進行訓練,所以可以只安裝 CPU 版):
  • 神經網絡中的各種損失函數介紹
    不同的損失函數可用於不同的目標。在這篇文章中,我將帶你通過一些示例介紹一些非常常用的損失函數。這篇文章提到的一些參數細節都屬於tensorflow或者keras的實現細節。損失函數的簡要介紹損失函數有助於優化神經網絡的參數。