1. 程式人生 > >Tensorflow的應用(三)

Tensorflow的應用(三)

         主要是兩部分內容:代價函式和優化器

一、代價函式

1、二次代價函式

      二次代價函式計算公式如下:

                         

       其中,其中, C表示代價 函式 ,x表示樣本, y表示實際值, 表示實際值, 表示實際值, a表示輸出值, 表示輸出值, n表示樣本的總數。為簡單起見 表示樣本的總數。為簡單起見 表示樣本的總數。為簡單起見 表示樣本的總數。為簡單起見 表示樣本的總數。為簡單起見 ,同樣一個本為例進行說明,此時二次代價函式:


其中,a=σ(z), z=∑W a=σ(z), σ()是啟用函式

       假如我們使用梯度下降法 (Gradient descent) (Gradient descent) (Gradient descent) (Gradient descent) (Gradient descent) 來調整權值 引數的大小,w和偏置 和偏置 b的梯度推導 的梯度推導 的梯度推導如下:

                                        

       其中, z表示神經元的輸入, σ表示啟用函式。 w和b的梯度跟啟用函式成正比,梯度越大, w和b的大小調整得越快。

       假設我們的啟用函式是sigmoid函式,假設目標值是求最小損失,離目標較遠的時候,梯度下降速度較慢,離目標較近時,梯度下降較快,這是不合理的,所以在使用啟用函式為sigmoid函式的情況下,二次代價函式不適合。

2、交叉熵代價函式

其公式如下所示:

                     

其中, C表示代價 函式 ,x表示樣本, y表示實際值, a表示輸出值, n表示樣本的總數。



       權值和偏置值的調整與無關,另外,梯度公式中的表示輸出值與實際值的誤差。所以當誤差越大時,梯度就越大,引數w和b的調整越快。如果輸出神經元是線性的,那麼二次代價函式就是一種合適的選擇。如果輸出神經元是S型函式,那麼比較適合用交叉熵代價函式。

3、對數似然函式

        對數釋然函常用來作為 softmax 迴歸的代價函式,如果輸出層神經元是sigmoid函式,可以採用交叉熵代價函式,而深度學習中更普遍的做法是將softmax作為最後一層,此時常用的代價函式是對數似然代價函式。

       對數似然代價函式與softmax的組合和交叉熵與sigmoid函式的組合非常相似。對數似然代價函式在二分類時可以簡化為交叉熵代價函式的形式。

        tf.sigmoid_cross_entropy_with_logits表示跟sigmoid搭配使用的交叉熵, tf.softmax_cross_entropy_with_logits表示跟softmax搭配使用的交叉熵

4、解決過擬合問題

(1)增加資料集

(2)正則化方法,有L1正則化和L2正則化,就是在代價函式中加入L1正則項和L2正則項,L1正則化是全部權重的絕對值平均,L2正則化是全部權重的均方,某些神經元的權重會被設定得特別小,甚至接近0,以減小過擬合情況。

(3)dropout方法,就是每次訓練時,每層隱藏層只允許部分神經元工作。

二、優化器

1、Tensorflow的優化器如下:

tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSPropOptimizer

2、各種優化器對比:
標準梯度下降法:
標準梯度下降先計算所有樣本彙總誤差,然後根據總誤差來更新權值
隨機梯度下降法:
隨機梯度下降隨機抽取一個樣本來計算誤差,然後更新權值
批量梯度下降法:
批量梯度下降算是一種折中的方案,從總樣本中選取一個批次(比如一共有10000個樣本,隨機選取100個樣本作為一個batch),然後計算這個batch的總誤差,根據總誤差來更新權值。

3、常用的幾種優化器介紹

(1)SGD

W =W−η⋅∇WJ(W;x(i);y(i))

(2) Momentun

γ:動力,通常設定為0.9
vt = γvt−1 + η∇WJ(W)
W = W−vt
當前權值的改變會受到上一次權值改變的影響,類似於小球向下滾動的時候帶上了慣性。這樣可以加快小球的向下的速度。

(3)NAG

vt = γvt−1 + η∇WJ(W−γvt−1)
W = W−vt

       NAG在TF中跟Momentum合併在同一個函式tf.train.MomentumOptimizer中,可以通過引數配置啟用。
在Momentun中小球會盲目地跟從下坡的梯度,容易發生錯誤,所以我們需要一個更聰明的小球,這個小球提前知道它要去哪裡,它還要知道走到坡底的時候速度慢下來而不是又衝上另一個坡。γvt−1會用來修改W的值,計算W−γvt−1可以表示小球下一個位置大概在哪裡。從而我們可以提前計算下一個位置的梯度,然後使用到當前位置。

(4)Adagrad

i:代表第i個分類
t:代表出現次數
ϵ:的作用是避免分母為0,取值一般為1e-8
η:取值一般為0.01
gt,i = ∇WJ(Wi)

它是基於SGD的一種演算法,它的核心思想是對比較常見的資料給予它比較小的學習率去調整引數,對於比較罕見的資料給予它比較大的學習率去調整引數。它很適合應用於資料稀疏的資料集(比如一個圖片資料集,有10000張狗的照片,10000張貓的照片,只有100張大象的照片)。
Adagrad主要的優勢在於不需要人為的調節學習率,它可以自動調節。它的缺點在於,隨著迭代次數的增多,學習率也會越來越低,最終會趨向於0。

(5)RMSprop

RMS(Root Mean Square)是均方根的縮寫。
γ:動力,通常設定為0.9
η:取值一般為0.001
E[g2]t:表示前t次的梯度平方的平均值
gt= ∇WJ(W)
E[g2]t= γE[g2]t-1+ (1-γ)g
2t


       RMSprop借鑑了一些Adagrad的思想,不過這裡RMSprop只用到了前t-1次梯度平方的平均值加上當前梯度的平方的和的開平方作為學習率的分母。這樣RMSprop不會出現學習率越來越低的問題,而且也能自己調節學習率,並且可以有一個比較好的效果。

(6)Adadelta


使用Adadelta我們甚至不需要設定一個預設學習率,在Adadelta不需要使用學習率也可以達到一個非常好的效果。

(7) Adam:


就像Adadelta和RMSprop一樣Adam會儲存之前衰減的平方梯度,同時它也會儲存之前衰減的梯度。經過一些處理之後再使用類似Adadelta和RMSprop的方式更新引數。

三、程式碼例項

      依然是tensorflow應用(二)中的手寫識別字型的例子,但增加了dropout,改變了優化器。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


#載入資料集
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)


#每個批次的大小
batch_size = 100
#計算一共有多少個批次
n_batch = mnist.train.num_examples // batch_size


#定義兩個placeholder
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
keep_prob=tf.placeholder(tf.float32)


#建立一個簡單的神經網路
W1 = tf.Variable(tf.truncated_normal([784,2000],stddev=0.1))
b1 = tf.Variable(tf.zeros([2000])+0.1)
L1 = tf.nn.tanh(tf.matmul(x,W1)+b1)
L1_drop = tf.nn.dropout(L1,keep_prob) #使用dropout解決過擬合


W2 = tf.Variable(tf.truncated_normal([2000,2000],stddev=0.1))
b2 = tf.Variable(tf.zeros([2000])+0.1)
L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)
L2_drop = tf.nn.dropout(L2,keep_prob) 


W3 = tf.Variable(tf.truncated_normal([2000,1000],stddev=0.1))
b3 = tf.Variable(tf.zeros([1000])+0.1)
L3 = tf.nn.tanh(tf.matmul(L2_drop,W3)+b3)
L3_drop = tf.nn.dropout(L3,keep_prob) 


W4 = tf.Variable(tf.truncated_normal([1000,10],stddev=0.1))
b4 = tf.Variable(tf.zeros([10])+0.1)
prediction = tf.nn.softmax(tf.matmul(L3_drop,W4)+b4)


#二次代價函式
# loss = tf.reduce_mean(tf.square(y-prediction))
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))#交叉熵代價函式
#使用梯度下降法
#train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)#使用adam優化器


#初始化變數
init = tf.global_variables_initializer()


#結果存放在一個布林型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一維張量中最大的值所在的位置
#求準確率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


with tf.Session() as sess:
    sess.run(init)
    for epoch in range(31):
            sess.run(tf.assign(lr, 0.001 * (0.95 ** epoch)))#一開始賦予比較高的學習率,當其越來越接近最低點的時候,降低其學習率,防止其在最低點震盪。
        for batch in range(n_batch):
            batch_xs,batch_ys = mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7})
        learning_rate = sess.run(lr)
        test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
        train_acc = sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels,keep_prob:1.0})
        print("Iter " + str(epoch) + ",Testing Accuracy " + str(test_acc) +",Training Accuracy " + str(train_acc)+",Learning Rate= " + str(learning_rate))

相關推薦

深度學習框架TensorFlow學習與應用——使用交叉熵作為代價函式

二次代價函式(quadratic cost): 其中,C表示代價函式,x表示樣本,y表示實際值,a表示輸出值,n表示樣本的總數。 例如: 假如我們使用梯度下降法(Gradient descent)來調整權值引數的大小,權值w和偏置b的梯

基於谷歌開源的TensorFlow Object Detection API視訊物體識別系統搭建自己的應用

下載opencv的cv2包在Python官網即可下載opencv相關庫,點選此處直接進入。 pip install opencv-python安裝完成後,進入IDLE輸入命令import cv2若未報錯,則opencv-python庫成功匯入,環境搭配成功。基於上篇新建Cam

Tensorflow應用

         主要是兩部分內容:代價函式和優化器 一、代價函式 1、二次代價函式       二次代價函式計算公式如下:                                  其中,其中, C表示代價 函式 ,x表示樣本, y表示實際值, 表示實際值, 表示

######較深的應用TensorFlow學習:Graph和Session ######較深的應用

之前講完變數常量等等基本量的操作,意味著最基本的東西都有了,然後接下來很重要的就是那些量和操作怎麼組成更大的集合,怎麼執行這個集合。這些就是計算圖譜graph和Session的作用了。 IV.Graph https://www.tensorflow.org/versions/r0.11/api_docs/p

vuex實踐之路——筆記本應用

lang 們的 res tool method note 做到 筆記 not Actions Action 類似於 mutation,不同在於: Action 提交的是 mutation,而不是直接變更狀態。 Action 可以包含任意異步操作。 讓我們來註冊一個簡單的

TF-IDF與余弦相似性的應用:自動摘要

下一步 dip target 似的 abs tps .net ebo ace 轉:http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html 有時候,很簡單的數學方法,就可以完成很復雜的任務。 這個

shell腳本應用for、while、case語句

姓名 std proc pgrep 符號 prefix dfa 先生 let 前言:當面對各種列表重復任務時,使用if語句已經難以滿足要求,而順序編寫全部代碼更是顯得異常繁瑣,困難重重。使用循環、分支等其他程序控制結構,從而能夠輕松完成更加復雜、強大的功能。1、使用for循

MATLAB在數學建模中的應用

dash 以及 cxf 原始的 計算 而後 輸入輸出變量 tran fcm optimset函數 功能:創建或編輯優化選項參數結構。 語法: 1 options = optimset(‘param1’,value1,’para

函數計算搭建 Serverless Web 應用- 分鐘搭建 Web 應用

env 方便 級別 語言 摘要 設置 基礎設施 路由 serve 摘要: 本文對使用自定義域名 + HTTP 觸發器搭建 Web 應用的步驟進行詳細介紹,手把手帶您三分鐘搭建穩定可靠的 Web 應用。 簡介阿裏雲 函數計算(Function Compute) 是事件驅動的全

由散列表到BitMap的概念與應用:面試中的海量資料處理

一道面試題 在面試軟體開發工程師時,經常會遇到海量資料排序和去重的面試題,特別是大資料崗位。 例1:給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,找出a、b檔案共同的url? 首先我們最常想到的方法是讀取檔案a,建立雜湊表,然後再讀取檔案b,遍歷檔

IO流的應用異常列印日誌檔案中

package com.bjpowernode.demo02; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.i

VB6基本資料庫應用:連線資料庫與SQL語句的Select語句初步

資料庫我們已經建好了,重提一下上一章的結果,我們最後建立了一張Student的表,其中有StudentID(數字的雙精度型別)和StudentName(文字型別。補充一下,2013中有【長文字】和【短文字】,人名不會很長,根據上一章選擇儘量小的資料型別的規則,這裡就選【短文字】就可以了)。儘

TensorFlow學習:tf.reduce_sum()

壓縮求和 tf.reduce_sum( input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None, keep_dims=None ) Args:

elasticsearch摸石頭過河——基本安裝應用

        首先從官網下載elasticsearch:https://www.elastic.co/downloads/elasticsearch     需要jdk版本1.8:https://www.oracle.com/technetwork/java/javase/downl

TensorFlow 學習 圖和會話

    資料流圖是一種常用於平行計算的程式設計模型。大多數TensorFlow程式都是從資料流圖構建階段開始,這些函式可構建新的 tf.Operation(節點)和 tf.Tensor(邊緣)物件並將它們新增到 tf.Graph 例項中。TensorFlow 提供了一個預設圖,此

Spring Boot Actuator詳解與深入應用:Prometheus+Grafana應用監控

《Spring Boot Actuator詳解與深入應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指

ArcGIS for Android 100.3的學習與應用 實現地圖新增自定義指北針

圖為高德地圖實現指北針的效果,那麼ArcGIS如何實現呢? 實現方式: 新增地圖的旋轉監聽: map.addMapRotationChangedListener(new MapRotationChangedListener() { @Override

Java Socket應用多執行緒實現多客戶端的通訊

伺服器執行緒處理類ServerThread.java : package com.yijia; import java.io.*; import java.net.Socket; /** * 建立時間:2018/10/4 14:59 * 作者: * 郵箱:[ema

Tensorflow框架

一、MNIST數字識別 首先載入MNIST手寫數字識別訓練集 mnist = input_data.read_data_sets("C:/Users/14981/Desktop/Deep Learning/", one_hot = True) # 載入資料集 print("Traing da

函式計算搭建 Serverless Web 應用- 分鐘搭建 Web 應用

摘要: 本文對使用自定義域名 + HTTP 觸發器搭建 Web 應用的步驟進行詳細介紹,手把手帶您三分鐘搭建穩定可靠的 Web 應用。 簡介 阿里雲 函式計算(Function Compute) 是事件驅動的全託管計算服務,是阿里雲的 Serverless 計算平臺。基於