1. 程式人生 > >【TensorFlow】關於tf.nn.sparse_softmax_cross_entropy_with_logits()

【TensorFlow】關於tf.nn.sparse_softmax_cross_entropy_with_logits()

tf.nn.sparse_softmax_cross_entropy_with_logits()

這是一個TensorFlow中經常需要用到的函式。官方文件裡面有對它詳細的說明,傳入的logits為神經網路輸出層的輸出,shape為[batch_size,num_classes],傳入的label為一個一維的vector,長度等於batch_size,每一個值的取值區間必須是[0,num_classes),其實每一個值就是代表了batch中對應樣本的類別。今天我們就從實際的專案程式碼裡入手,看看這個函式在實際專案中是如何應用的。

tf.nn.sparse_softmax_cross_entropy_with_logits()首先來說,這個函式的具體實現分為了兩個步驟,我們一步一步依次來看。


第一步:Softmax

不管是在進行文字分類還是影象識別等任務時,神經網路的輸出層個神經元個數通常都是我們要分類的類別數量,也可以說,神經網路output vector的dimension通常為類別數量,而我們的Softmax函式的作用就是將每個類別所對應的輸出分量歸一化,使各個分量的和為1,這樣可以理解為將output vector的輸出分量值,轉化為了將input data分類為每個類別的概率。舉一個例子來說:


假設上面這個圖中的Z1,Z2,Z3為一個三分類模型的output vector,為[3,1,-3],3代表類別1所對應的分量,1為類別2對應的分量,-3為類別3對應的分量。經過Softmax函式作用後,將其轉化為了[0.88,0.12,0],這就代表了輸入的這個樣本被分到類別1的概率為0.88,分到類別2的概率為0.12,分到類別3的概率幾乎為0。

這就是Softmax函式的作用,Softmax函式的公式如下所示,我們就不做詳細講解了。


第二步:計算Cross-Entropy

神經網路的輸出層經過Softmax函式作用後,接下來就要計算我們的loss了,這個這裡是使用了Cross-Entropy作為了loss function。由於tf.nn.sparse_softmax_cross_entropy_with_logits()輸入的label格式為一維的向量,所以首先需要將其轉化為one-hot格式的編碼,例如如果分量為3,代表該樣本屬於第三類,其對應的one-hot格式label為[0,0,0,1,.......0],而如果你的label已經是one-hot格式,則可以使用tf.nn.softmax_cross_entropy_with_logits()函式來進行softmax和loss的計算。

轉為one-hot格式之後就該計算我們的cross-entropy了,公式如下:


其中為label中的第i個值,為經softmax歸一化輸出的vector中的對應分量,由此可以看出,當分類越準確時,所對應的分量就會越接近於1,從而的值也就會越小。

程式碼

講了這麼多,我們來看看專案中是怎樣運用這個函式的,直接上程式碼。

這是之前做實驗時寫的文字分類的一個程式,其中就用到tf.nn.sparse_softmax_cross_entropy_with_logits()來計算loss。

            self.logits = tf.matmul(out_put,output_w)+output_b
            self.softmax = tf.nn.softmax(self.logits)

        with tf.name_scope("loss"):
            self.loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.logits+1e-10,labels=self.target)
            self.cost = tf.reduce_mean(self.loss)

這裡是LSTM_Model程式裡面的部分擷取,其中self.logits為神經網路輸出層的輸出,下一行,這裡我們使用tf.nn.softmax()計算一下softmax函式的輸出結果,是為了打印出來給大家看一下資料,但是在專案中這一行其實是多餘的~

下面我們使用tf.nn.sparse_softmax_cross_entropy_with_logits()函式,最後tf.reduce_mean()對batch_size裡每個樣本的loss求平均,計算最後的cost值。

我們來看一下結果,我的batch_size為64,資料太多我只截取了前五組資料:

首先是self.logits,這是神經網路輸出層輸出的vector,由於我做的是二分類任務,所以shape=[64,2]


下面是softmax函式作用後的輸出結果,我們可以看出來shape依舊是[64,2],但是資料已經被歸一化了。


下面是輸入的label


接下來是64個樣本的loss的值


最後是cost的值

相關推薦

TensorFlow關於tf.nn.sparse_softmax_cross_entropy_with_logits

tf.nn.sparse_softmax_cross_entropy_with_logits()這是一個TensorFlow中經常需要用到的函式。官方文件裡面有對它詳細的說明,傳入的logits為神經網路輸出層的輸出,shape為[batch_size,num_classes

TensorFlowtf.nn.conv2d是怎樣實現卷積的?有1*11×1卷積介紹

除去name引數用以指定該操作的name,與方法有關的一共五個引數: 第一個引數input:指需要做卷積的輸入影象,它要求是一個Tensor,具有[batch, in_height, in_width, in_channels]這樣的shape,具體含義是[訓練時一個batch的圖片數量, 圖片

TensorFlowtf.nn.softmax_cross_entropy_with_logits的用法

white 交叉 none padding tomat ros true const cross 在計算loss的時候,最常見的一句話就是 tf.nn.softmax_cross_entropy_with_logits ,那麽它到底是怎麽做的呢? 首先明確一點,loss是代

TensorFlowtf.nn.conv2d_transpose是怎樣實現反捲積的?

三個月沒更新了啊,回來更一發~~ csdn上主要講一些coding過程中遇到的函式,問題,解決方案。偏實踐 另外,如果你想看一些理論方面的東西,歡迎加我的知乎知乎主頁 csdn私信幾乎不看,有問題交流可以發郵箱:[email protected]或者知乎私

TensorFlowtf.nn.max_pool實現池化操作

版權宣告:本文為博主原創文章,轉載請註明出處。    https://blog.csdn.net/mao_xiao_feng/article/details/53453926 max pooling是CNN當中的最大值池化操作,其實用法和卷積很類似 有些地方可以從卷積去參考

Tensorflowtf.nn.separable_conv2d

【Tensorflow】tf.nn.separable_conv2d實現深度可分卷積   出處:https://blog.csdn.net/mao_xiao_feng/article/details/78002811 實驗環境:tensorflow版本1.2.0,python2

Tensorflowtf.nn.dropout函式

tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None) 此函式是為了防止在訓練中過擬合的操作,將訓練輸出按一定規則進行變

tf.nn.sparse_softmax_cross_entropy_with_logits的內部計算的理解

探索tf.nn.sparse_softmax_cross_entropy_with_logits,def sparse_softmax_cross_entropy_with_logits(    _sentinel=None,  # pylint: disable=inval

TensorFlowtf.nn.conv2d是怎樣實現卷積的?

文章出處:http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tf.nn.conv2d是TensorFlow裡面實現卷積的函式,參考文件對它的介紹並不是很詳細,實際上這是搭建卷積神經網路比較

TensorFlowProgramming model + 小試牛刀模擬Neural Network

1 【TensorFlow】程式設計模式 TensorFlow 程式設計模式的核心是“計算圖”,可分為兩部分:建立“計算圖”與執行計算圖 ,更多說明可以檢視 《TensorFlow+Keras》Learning notes 1.1 建立計算圖 匯入Tenso

TensorFlow正則化過擬合問題

轉載自:https://www.cnblogs.com/linyuanzhou/p/6923607.html,尊重原創 tf.add_to_collection:把變數放入一個集合,把很多變數變成一個列表 tf.get_collection:從一個結合中取出全部變數,是一個列表 tf.add_n:把一個列表

tensorFlowtf.reshape()報錯信息 - TypeError: Expected binary or unicode string

bject port cas inpu dimen div nts sof expec 今天在使用tensoflow跑cifar10的CNN分類時候,download一個源碼,但是報錯 TypeError: Failed to convert object of type

tensorflowtf.identity()

常與tf.control_dependencies(self, control_inputs)配合使用,只有當這個上下文管理器中的是一個操作時,control_inputs才會執行。 x = tf.Variable(0.0) x_plus_1 = tf.assign_add(x, 1)

tensorflowtf.get_variable()和tf.Variable()的區別

1.tf.Variable() tf.Variable(initial_value, trainable=True, collections=None, validate_shape=True, name=None) ##initial_value為變數的初始值 tf.get

Tensorflowtf.import_graph_def

tf.import_graph_def tf.import_graph_def(     graph_def,     input_map=None,     return_elements=None,     name=None,     op_dict=None,  

Tensorflowtf.nn.atrous_conv2d如何實現空洞卷積?

value:  指需要做卷積的輸入影象,要求是一個4維Tensor,具有[batch, height, width, channels]這樣的shape,具體含義是[訓練時一個batch的圖片數量, 圖片高度, 圖片寬度, 影象通道數] filters: 

Tensorflowtf.app.run() 與 tf.app.flags()

tf.app.flags tf.app.flags.DEFINE_XXX()用來定義引數項: import tensorflow as tf tf.app.flags.DEFINE_float(

TensorFlowtf.scatter_update()

在看tensorflow官網的API的時候,看到一個更新資料的函式。該函式的目的是為了能更新tensor的值,這個函式也解決了之前我想要更新tensor值的想法。在網上找了很多關於 tf.scatte

Tensorflowtf.placeholder函式

tf.placeholder(dtype, shape=None, name=None) 此函式可以理解為形參,用於定義過程,在執行的時候再賦具體的值 引數: dtype:資料型別。常用的是tf.float32,tf.float64等數值型別 shape:資料

tensorflowtf.one_hot,tf.reduce_mean,tf.argmax,tf.equal,tf.cast學習

由於使用tensorflow訓練時經常用到一些對求準確率、損失值、預測值等資料處理的函式,特此記錄一下。 0、準備資料 首先準備一些資料,作為計算後的y值和真實標籤t。 一維,長度是10,代表10組資料,每個數字代表一種類別,共4種類別,0 1