日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

【TensorFlow-windows】部分损失函数测试

發(fā)布時(shí)間:2023/12/13 windows 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【TensorFlow-windows】部分损失函数测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在TensorFlow中提供了挺多損失函數(shù)的,這里主要測(cè)試一下均方差與交叉熵相關(guān)的幾個(gè)函數(shù)的計(jì)算流程。主要是測(cè)試來自于tf.nn與tf.losses的mean_square_error、sigmoid_cross_entry、softmax_cross_entry、sparse_softmax_cross_entry

國(guó)際慣例,參考博客:

官方文檔

一文搞懂交叉熵在機(jī)器學(xué)習(xí)中的使用,透徹理解交叉熵背后的直覺

TensorFlow中多標(biāo)簽分類

預(yù)備

單熱度編碼one-hot

先復(fù)習(xí)一下one_hot編碼,就是將真實(shí)標(biāo)簽轉(zhuǎn)換為01標(biāo)簽,需要注意的是tf的one_hot編碼中標(biāo)簽0代表的是1,0,0...而非0,0,0...

labels_n=np.array([0,1,2]) labels_oh=tf.one_hot(labels_n,depth=3) with tf.Session() as sess:print(sess.run(labels_oh))'''[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]'''

softmax

通常將最后的輸出規(guī)整到和為1的形式:

softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis)

設(shè)輸出為z=(z1,z2,? ,zn)z=(z_1,z_2,\cdots,z_n)z=(z1?,z2?,?,zn?),則
σ(z)j=ezj∑i=1nezk\sigma(z)_j=\frac{e^{z_j}}{\sum_{i=1}^n e^{z_k}} σ(z)j?=i=1n?ezk?ezj??

sigmoid

激活函數(shù):
f(x)=11+e?xf(x)=\frac{1}{1+e^{-x}} f(x)=1+e?x1?

交叉熵

多標(biāo)簽分類(每個(gè)樣本可能屬于多個(gè)標(biāo)簽),最后一層使用sigmoid激活:

?ylog?(P(y))?(1?y)log?(1?P(y))-y\log(P(y))-(1-y)\log(1-P(y)) ?ylog(P(y))?(1?y)log(1?P(y))

單標(biāo)簽分類(每個(gè)樣本只可能屬于一個(gè)標(biāo)簽),最后一層使用softmax激活:
?∑i=1nyilog?(P(yi))-\sum_{i=1}^n y_i\log(P(y_i)) ?i=1n?yi?log(P(yi?))

準(zhǔn)備測(cè)試

進(jìn)入測(cè)試之前,需要先引入相關(guān)的包

import numpy as np import tensorflow as tf

交叉熵相關(guān)函數(shù)的測(cè)試,使用的變量是

labels=np.array([[1,0,0],[0,1,0],[0,0,1]],dtype='float32') preds=np.array([[5,6,3],[7,5,1],[1,2,8]],dtype='float32')

均方差損失-MSE

原理

對(duì)應(yīng)項(xiàng)相減的平方和的均值,通常用來做回歸,計(jì)算預(yù)測(cè)值與真實(shí)值的誤差

代碼測(cè)試

定義相關(guān)變量:

ori_labels=np.array([[1,2,3]],dtype='float32') pred_labels=np.array([[5,3,3]],dtype='float32')

調(diào)用原本函數(shù)測(cè)試:

mse_op=tf.losses.mean_squared_error(labels=ori_labels,predictions=pred_labels) with tf.Session() as sess:print(sess.run(mse_op))'''5.6666665'''

手動(dòng)實(shí)現(xiàn)過程:

with tf.Session() as sess:print(sess.run(tf.reduce_mean(tf.square(ori_labels-pred_labels)))) ''' 5.6666665 '''

總結(jié)

原理就是求原標(biāo)簽與預(yù)測(cè)標(biāo)簽的平方和損失的均值。

sigmoid_cross_entry

原理

使用sigmoid激活的交叉熵,毫無疑問,玩得多標(biāo)簽分類,流程是:

  • 將輸出用sigmoid激活
  • 使用多標(biāo)簽分類的交叉熵計(jì)算損失

代碼測(cè)試

使用tf.losses中的交叉熵?fù)p失

tf_sce=tf.losses.sigmoid_cross_entropy(labels,preds) with tf.Session() as sess:print(sess.run(tf_sce)) #2.3132434

使用tf.nn中的交叉熵?fù)p失:

tf_sce1=tf.nn.sigmoid_cross_entropy_with_logits(labels=labels,logits=preds) with tf.Session() as sess:print(sess.run(tf_sce1)) '''[[6.7153485e-03 6.0024757e+00 3.0485873e+00][7.0009112e+00 6.7153485e-03 1.3132617e+00][1.3132617e+00 2.1269281e+00 3.3540637e-04]] '''

使用流程實(shí)現(xiàn):

#先計(jì)算sigmoid,再計(jì)算交叉熵 preds_sigmoid=tf.sigmoid(preds) ce=-labels*tf.log(preds_sigmoid)-(1-labels)*(tf.log(1-preds_sigmoid)) # ce= - tf.reduce_sum(labels*tf.log(preds_sigmoid),-1) with tf.Session() as sess:print(sess.run(ce))print(sess.run(tf.reduce_mean(ce))) ''' [[6.7153242e-03 6.0024934e+00 3.0485876e+00][7.0009704e+00 6.7153242e-03 1.3132617e+00][1.3132617e+00 2.1269276e+00 3.3539196e-04]] 2.3132522 '''

總結(jié)

  • 多標(biāo)簽分類,輸入是原始和預(yù)測(cè)標(biāo)簽的編碼

  • tf.losses中的計(jì)算結(jié)果是tf.nn中計(jì)算結(jié)果的均值

softmax_cross_entry

原理

使用softmax激活,顯然就是單標(biāo)簽分類的情況,流程是:

  • 將輸出用softmax激活
  • 計(jì)算單標(biāo)簽分類的交叉熵?fù)p失

代碼測(cè)試

使用tf.losses中的函數(shù):

tf_sce=tf.losses.softmax_cross_entropy(labels,preds) with tf.Session() as sess:print(sess.run(tf_sce)) #1.160502

使用tf.nn中的函數(shù):

tf_sce1=tf.nn.softmax_cross_entropy_with_logits(labels=labels,logits=preds) with tf.Session() as sess:print(sess.run(tf_sce1)) #[1.3490121 2.129109 0.00338493]

使用流程計(jì)算:

#先計(jì)算softmax,再計(jì)算交叉熵 preds_sigmoid=tf.nn.softmax(preds) ce= - tf.reduce_sum(labels*tf.log(preds_sigmoid),-1) # ce=-labels*tf.log(preds_sigmoid)-(1-labels)*(tf.log(1-preds_sigmoid)) with tf.Session() as sess:print(sess.run(ce))print(sess.run(tf.reduce_mean(ce))) ''' [1.3490121 2.129109 0.00338495] 1.1605021 '''

總結(jié)

  • 用于單標(biāo)簽分類,輸入是真實(shí)和預(yù)測(cè)標(biāo)簽的單熱度編碼
  • tf.losses中的計(jì)算結(jié)果是tf.nn中計(jì)算結(jié)果的均值

sparse_softmax_cross_entry

原理

還是看到softmax,依舊是單標(biāo)簽分類,但是多了個(gè)sparse,代表輸入標(biāo)簽可以是非單熱度標(biāo)簽,流程:

  • 將原標(biāo)簽轉(zhuǎn)為單熱度編碼
  • 將輸出用softmax激活
  • 計(jì)算單標(biāo)簽分類的交叉熵

代碼測(cè)試

假設(shè)原始標(biāo)簽的非單熱度編碼是:

labels_n=np.array([0,1,2])

利用tf.losses中的損失函數(shù):

tf_scen=tf.losses.sparse_softmax_cross_entropy(labels=labels_n,logits=preds) with tf.Session() as sess:print(sess.run(tf_sce)) #1.160502

利用tf.nn中的損失函數(shù):

tf_sce1=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels_n,logits=preds) with tf.Session() as sess:print(sess.run(tf_sce1))print(sess.run(tf.reduce_mean(tf_sce1))) ''' [1.3490121 2.129109 0.00338493] 1.160502 '''

利用流程實(shí)現(xiàn):

labels_onehot=tf.one_hot(labels_n,depth=3) preds_sigmoid=tf.nn.softmax(preds) ce= - tf.reduce_sum(labels_onehot*tf.log(preds_sigmoid),-1) # ce=-labels*tf.log(preds_sigmoid)-(1-labels)*(tf.log(1-preds_sigmoid)) with tf.Session() as sess:print(sess.run(labels_onehot))print(sess.run(ce))print(sess.run(tf.reduce_mean(ce))) ''' [[1. 0. 0.][0. 1. 0.][0. 0. 1.]] [1.3490121 2.129109 0.00338495] 1.1605021 '''

總結(jié)

  • 有sparse代表原始標(biāo)簽不用轉(zhuǎn)成單熱度編碼
  • 適用于單標(biāo)簽分類
  • tf.losses是tf.nn中函數(shù)的均值

總結(jié)

本文主要對(duì)比了:

  • tf.nn、tf.losses中同一類損失函數(shù)的使用方法與區(qū)別
  • 分析計(jì)算流程,并實(shí)現(xiàn)驗(yàn)證
  • 了解TensorFlow中回歸、單標(biāo)簽分類、多標(biāo)簽分類的損失函數(shù)的選擇

博客代碼:

鏈接:https://pan.baidu.com/s/1b40rNxjdOIIE2g7_Afctiw
提取碼:0sb0

總結(jié)

以上是生活随笔為你收集整理的【TensorFlow-windows】部分损失函数测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。