1. 程式人生 > >李嘉璇 TensorFlow技術解析與實戰 第四章筆記 TensorFlow基礎知識

李嘉璇 TensorFlow技術解析與實戰 第四章筆記 TensorFlow基礎知識

系統架構

  • 最下層是網路通訊層和裝置管理層。網路通訊層包括 gRPCgoogle Remote Procedure Call Protocol)和遠端直接資料存取(Remote DirectMemory AccessRDMA),這都是在分散式計算時需要用到的。裝置管理層包括 TensorFlow 分別在 CPUGPUFPGA 等裝置上的實現,也就是對上層提供了一個統一的介面,使上層只需要處理卷積等邏輯,而不需要關心在硬體上的卷積的實現過程。
  • 資料操作層,主要包括卷積函式、啟用函式等操作。再往上是圖計算層,也是我們要了解的核心,包含本地計算圖和分散式計算圖的實現
  • API 層和應用層


程式設計模型


輸入、塑性、RELU非線性啟用、邏輯層、softmax輸出、交叉熵、梯度、SGD訓練。

TensorFlow支援的張量具有的資料屬性

TensorFlow實現的運算元


常用API

tf.Graph


tf.Operation



tf.Tensor

tf.Tensor 類是操作輸出的符號控制代碼,它不包含操作輸出的值,而是提供了一種在 tf.Session中計算這些值的方法。這樣就可以在操作之間構建一個數據流連線,使 TensorFlow 能夠執行一個表示大量多步計算的圖形。


視覺化

視覺化時,需要在程式中給必要的節點新增摘要summary),摘要會收集該節點的資料,並標記上第幾步、時間戳等標識,寫入
事件檔案event file)中。 tf.summary.FileWriter 類用於在目錄中建立事件檔案,並且向檔案中新增摘要和事件,用來在 TensorBoard 中展示。

變數作用域(沒懂)

日後再補

batch normalization 批標準化

  • ICSInternal Covariate Shift)理論:源域和目標域的資料分佈是一致的,即訓練資料和測試資料是滿足相同分佈的。
  • Covariate Shift 是指訓練集的樣本資料和目標樣本集分佈不一致時,訓練得到的模型無法很好地泛化generalization)。(源域與目標域的條件概率相同,但邊緣概率不同)

方法

批標準化一般用在非線性對映(啟用函式)之前,對

x=Wu+b 做規範化,使結果(輸出訊號各個維度)的均值為 0,方差為 1。讓每一層的輸入有一個穩定的分佈會有利於網路的訓練。 (理解為mean normalization?)

歸一化均值為0,方差為1。規範化,這裡也可以稱為標準化,是將資料按比例縮放,使之落入一個小的特定區間。這裡是指將資料減去平均值,再除以標準差。 

優點

  • 神經網路收斂速度慢或梯度爆炸等無法訓練的情況下,可以嘗試。
  • 加大學習速率。
  • 更容易跳出區域性最小值。
  • 破壞原來的資料分佈,一定程度上緩解過擬合問題。

(見Ng課程筆記

https://yoyoyohamapi.gitbooks.io/mit-ml/content/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/articles/%E7%89%B9%E5%BE%81%E7%BC%A9%E6%94%BE.html

https://yoyoyohamapi.gitbooks.io/mit-ml/content/%E7%89%B9%E5%BE%81%E9%99%8D%E7%BB%B4/articles/PCA.html)

神經元函式及優化方法

啟用函式

平滑非線性的啟用函式,如 sigmoidtanhelusoftplus softsign,也包括連續但不是處處可微的函式 relurelu6crelu relu_x,以及隨機正則化函式 dropout

  • tf.nn.relu()
  • tf.nn.sigmoid()
  • tf.nn.tanh()
  • tf.nn.elu()
  • tf.nn.bias_add()
  • tf.nn.crelu()
  • tf.nn.relu6()
  • tf.nn.softplus()
  • tf.nn.softsign()
  • tf.nn.dropout() # 防止過擬合,用來捨棄某些神經元

啟用函式輸入和輸出的維度完全相同,常見的啟用函式有sigmoid、tanh、relu、softplus四種。

sigmoid函式:

sigmoid 函式的優點在於,它的輸出對映在(0,1)內,單調連續,非常適合用作輸出層,並且求導比較容易。但是,它也有缺點,因為軟飽和性,一旦輸入落入飽和區, f'(x)就會變得接近於 0,很容易產生梯度消失

tanh函式:


tanh 函式也具有軟飽和性。因為它的輸出以 0 為中心,收斂速度比 sigmoid 要快。但是仍無法解決梯度消失的問題。

relu函式和softplus函式:


relu 函式是目前最受歡迎的啟用函式。 softplus可以看作是 ReLU的平滑版本。 relu定義為 f(x)=max(x,0)softplus 定義為 f(x)=log(1+exp(x))

relu函式的缺點:relu函式x<0 時硬飽和。由於 x>0 導數為 1,所以, relu 能夠在 x>0 時保持梯度不衰減,從而緩解梯度消失問題,還能夠更很地收斂,並提供了神經網路的稀疏表達能力。但是,隨著訓練的進行,部分輸入會落到硬飽和區(x<0時,導數為0),導致對應的權重無法更新。

除了 relu 本身外, TensorFlow 還定義了 relu6,也就是定義在 min(max(features, 0), 6)tf.nn.relu6(features, name=None),以及 crelu,也就是 tf.nn.crelu(features, name=None)

dropout函式:一個神經元將以概率 keep_prob 決定是否被抑制。如果被抑制,該神經元的輸出就為 0;如果不被抑制,那麼該神經元的輸出值將被放大到原來的 1/keep_prob 倍。 

dropout 在論文中最早被提出時是這麼做的:在訓練的時候用概率 p 丟棄,然後在預測的時候,所有引數按比例縮小,也就是乘以 p

不理解:在預設情況下,每個神經元是否被抑制是相互獨立的。但是否被抑制也可以通過 noise_shape 來調節。當 noise_shape[i] == shape(x)[i]時, x 中的元素是相互獨立的。如果 shape(x) = [k, l, m, n]x 中的維度的順序分別為批、行、列和通道,如果 noise_shape = [k, 1, 1, n],那麼每個批和通道都是相互獨立的,但是每行和每列的資料都是關聯的,也就是說,要不都為 0,要不都還是原來的值。 (noise__shape是怎麼設定的?)

啟用函式的選擇:

輸入資料特徵相差明顯時,tanh 的效果會很好,且在迴圈過程中會不斷擴大特徵效果並顯示出來。當特徵相差不明顯時,sigmoid 效果比較好。同時,sigmoid tanh 作為啟用函式時,需要對輸入進行規範化,否則啟用後的值全部都進入平坦區,隱層的輸出會全部趨同,喪失原有的特徵表達。而 relu 會好很多,有時可以不需要輸入規範化來避免上述情況。因此,現在大部分的卷積神經網路都採用 relu 作為啟用函式。大概有 85%90%的神經網路會採用 ReLU10%15%的神經網路會採用 tanh,尤其用在自然語言處理上。

卷積函式

池化函式

分類函式(輸出函式)

TensorFlow 中常見的分類函式主要有 sigmoid_cross_entropy_with_logits、 softmax、 log_softmax、softmax_cross_entropy_with_logits 等。

tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None) tf.nn.softmax(logits, dim=-1, name=None) tf.nn.log_softmax(logits, dim=-1, name=None) tf.nn.softmax_cross_entropy_with_logits(logits, labels, dim=-1, name=None) tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name=None)

tf.nn.sigmoid_cross_entropy_with_logits

這個函式的輸入要格外注意,如果採用此函式作為損失函式,在神經網路的最後一層不需要進行 sigmoid 運算。

tf.nn.softmax

tf.nn.softmax(logits, dim=-1, name=None)計算 Softmax 啟用,也就是 softmax = exp(logits) /reduce_sum(exp(logits), dim)。

tf.nn.log_softmax

tf.nn.log_softmax(logits, dim=-1, name=None)計算 log softmax 啟用,也就是 logsoftmax =logits - log(reduce_sum(exp(logits), dim))

tf.nn.softmax_cross_entropy_with_logits

tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1,name =None)

tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name=None)

優化函式

BGD、SGD、Momentum、Nesterov Momentum、Adagrad、 Adadelta、RMSprop、Adam.

收斂函式

BGD

優點:使用所有訓練資料進行計算,能夠保證收斂,不需要逐漸減少學習速率。 缺點:每一步更新都需要使用所有的訓練資料,隨著訓練的進行,速度會越來越慢。

SGD

優點:訓練資料很大的時候,能以較快的速度進行收斂。 缺點:需要手動調整學習率,容易收斂到區域性最優,並且在某些情況下可能困在鞍點。

Momentum法

Momentum 是模擬物理學中動量的概念,更新時在一定程度上保留之前的更新方向,利用當前的批次再微調本次的更新引數,因此引入了一個新的變數 v(速度),作為前幾次梯度的累加。因此, Momentum 能夠更新學習率,在下降初期,前後梯度方向一致時,能夠加速學習;在下降的中後期,在區域性最小值的附近來回震盪時,能夠抑制震盪,加很收斂。

Nesterov Momentum法

優化學習速率

Adagrad法

Adagrad 法能夠自適應地為各個引數分配不同的學習率,能夠控制每個維度的梯度方向。這種方法的優點是能夠實現學習率的自動更改:如果本次更新時梯度大,學習率就衰減得很一些;如果這次更新時梯度小,學習率衰減得就慢一些。(學習速率與梯度大小成正比)

Adadelta法

Adagrad 法仍然存在一些問題:其學習率單調遞減,在訓練的後期學習率非常小,並且需要手動設定一個全域性的初始學習率。Adadelta 法用一階的方法,近似模擬二階牛頓法,解決了這些問題。

RMSprop 法

RMSProp 法與 Momentum 法類似,通過引入一個衰減係數,使每一回合都衰減一定比例。在實踐中,對迴圈神經網路(RNN)效果很好。

Adam 法

Adam 的名稱來源於自適應矩估計(adaptive moment estimation)。 Adam 法根據損失函式針對每個引數的梯度的一階矩估計和二階矩估計動態調整每個引數的學習率。


模型的儲存與載入

TensorFlow 的 API 提供了以下兩種方式來儲存和載入模型。 (第一個只包含權重和其他在程式中定義的變數,第二個只包含圖形結構,不包含權重) (1)生成檢查點檔案(checkpoint file),副檔名一般為.ckpt,通過在 tf.train.Saver 物件上呼叫 Saver.save()生成。它包含權重和其他在程式中定義的變數,不包含圖結構。如果需要在另一個程式中使用,需要重新建立圖形結構,並告訴 TensorFlow 如何處理這些權重。 (2)生成圖協議檔案(graph proto file),這是一個二進位制檔案,副檔名一般為.pb,用tf.train.write_graph()儲存,只包含圖形結構,不包含權重,然後使用 tf.import_graph_def()來載入圖形。 具體見PDF94頁。

佇列和執行緒

TensorFlow 中主要有兩種佇列,即 FIFOQueue 和 RandomShuffleQueue。

FIFOQueue

FIFOQueue 建立一個先入先出佇列。例如,我們在訓練一些語音、文字樣本時,使用迴圈神經網路的網路結構,希望讀入的訓練樣本是有序的,就要FIFOQueue。

import tensorflow as tf
q=tf.FIFOQueue(3,"float")
init=q.enqueue_many(([0.1,0.2,0.3],))
x=q.dequeue()
y=x+1
q_inc=q.enqueue([y])
with tf.Session() as sess:
    sess.run(init)
    quelen=sess.run(q.size())
    for i in range(2):
        sess.run(q_inc)
    quelen=sess.run(q.size())
    for i in range(quelen):
        print(sess.run(q.dequeue()))

RandomShuffleQueue

RandomShuffleQueue 建立一個隨機佇列,在出佇列時,是以隨機的順序產生元素的。例如,我們在訓練一些影象樣本時,使用 CNN 的網路結構,希望可以無序地讀入訓練樣本,就要用RandomShuffleQueue,每次隨機產生一個訓練樣本。

import tensorflow as tf
q=tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes="float")
sess=tf.Session()
for i in range(0,10):
    sess.run(q.enqueue(i))
for i in range(0,8):
    print(sess.run(q.dequeue()))

佇列管理器

暫時用不到

執行緒和協調器

暫時用不到

載入資料

預載入資料

示例如下:

x1=tf.constant([2,3,4])
x2=tf.constant([4,0,1])
y=tf.add(x1,x2)
這種方式的缺點在於,將資料直接嵌在資料流圖中,當訓練資料較大時,很消耗記憶體。

填充資料

使用sess.run()的feed_dict引數,將python產生的資料填充給後端。 示例如下:

import tensorflow as tf
a1=tf.placeholder(tf.int16)
a2=tf.placeholder(tf.int16)
b=tf.add(a1,a2)
li1=[2,3,4]
li2=[4,0,1]
with tf.Session() as sess:
    print(sess.run(b,feed_dict={a1:li1,a2:li2}))
填充的方式也有資料量大、消耗記憶體等缺點,並且資料型別轉換等中間環節增加了不小開銷。

從檔案讀取資料

生成TFrecords檔案 從佇列中讀取

用到時再看 PDF103頁

實現一個自定義操作

PDF107頁

本章主要講解了 TensorFlow 的基礎知識,包括系統架構、設計理念、基本概念,以及常用的 API、神經元函式和神經網路,還介紹了儲存與載入模型的方法以及執行緒和佇列的知識,最後介紹了自定義操作的方法。


相關推薦

TensorFlow技術解析實戰 筆記 TensorFlow基礎知識

系統架構 最下層是網路通訊層和裝置管理層。網路通訊層包括 gRPC(google Remote Procedure Call Protocol)和遠端直接資料存取(Remote DirectMemory Access, RDMA),這都是在分散式計算時需要用到的。裝置管理層包

分享《TensorFlow技術解析實戰》+PDF+源碼+

下載 com .com type 51cto oss ces ESS 源代碼分析 下載:https://pan.baidu.com/s/1GQC9T7PBjaPnY2pa-ejQaA更多資料分享:http://blog.51cto.com/14087171 《TensorF

TensorFlow技術解析實戰》高清中文PDF+源代碼

mage vpd roc 代碼 深度學習 tensor 深入 shadow 基礎 下載:https://pan.baidu.com/s/1jdZ9eSrZ7xnsbbMIUO17qQ 《TensorFlow技術解析與實戰》高清中文PDF+源代碼 高清中文PDF,311頁,帶

分享《TensorFlow技術解析實戰》高清中文PDF+原始碼

下載:https://pan.baidu.com/s/1jdZ9eSrZ7xnsbbMIUO17qQ 《TensorFlow技術解析與實戰》高清中文PDF+原始碼 高清中文PDF,311頁,帶目錄和書籤,文字可以複製貼上,彩色配圖。配套原始碼。經典書籍。本書從深度學習的基礎講起,深入TensorFlow框

分享《TensorFlow技術解析實戰》高清中文PDF+源代碼

roc 文字 深度 log 51cto 復制 shadow proc http 下載:https://pan.baidu.com/s/1jdZ9eSrZ7xnsbbMIUO17qQ 《TensorFlow技術解析與實戰》高清中文PDF+源代碼 高清中文PDF,311頁,帶目

TensorFlow 技術解析實戰 筆記 01

TensorFlow 如何構建一個流圖呢,構建圖的第一步是建立各個節點。 import tensorflow as tf # 建立一個常量運算操作,產生一個 1×2 矩陣 matrix1 = tf.constant([[3., 3.]]) # 建立另外一個常量運算操作,產生一個 2×1 矩陣 m

TensorFlow技術解析實戰》高清中文PDF+原始碼高清完整版免費下載 《TensorFlow技術解析實戰》高清中文PDF+原始碼高清完整版免費下載

《TensorFlow技術解析與實戰》高清中文PDF+原始碼高清完整版免費下載 下載地址:https://pan.baidu.com/s/1eQdu3J9GvEyREBVvbs0msw 《TensorFlow技術解析與實戰》高清中文PDF+原始碼 高清中文PDF,311頁,帶目錄和書籤,文字可以

TensorFlow技術解析實戰 10 人臉識別

10.2 人臉識別的技術流程         人臉識別系統一般主要包括4個組成部分,分別為人臉影象採集及檢測、人臉影象預處理、人臉影象特徵提取以及人臉影象匹配與識別。             人臉識別的第一步就是人臉的影象採集及檢測。         人臉檢測屬於目標檢測的

機器學習深度學習領域參考書 《TensorFlow技術解析實戰》PDF下載

《TensorFlow技術解析與實戰》 機器學習深度學習領域參考書 包攬TensorFlow1.1的新特性 人臉識別 語音識別 影象和語音相結合等熱點一應俱全 李航 餘凱等人工智慧領域專家傾力推薦目錄第一篇 基礎篇下載地址:https://pan.baidu.com/s/1iKDExWOgCuvxyqsF1

TensorFlow技術解析實戰 8 一個tensorflow程式

TensorFlow的執行方式分如下4步: (1)載入資料及定義超引數 (2)構建網路 (3)訓練模型 (4)評估模型和進行預測 # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding(

TensorFlow技術解析實戰》學習筆記1

第1章 人工只能概述   機器是如何實現人類的智力呢?訓練,模型(引數)。深度學習+神經網路。   深度學習前身是Artificial Neural Network。Input Layer, Hidden Layout, Output Layer。   前向傳播(

Docker技術入門實戰 8 使用Dockerfile建立映象

Dockerfile是一個文字格式的配置檔案,使用者可以使用Dockerfile來快速建立自定義映象。本章首先介紹Dockerfile典型的基本結構和它支援的眾多指令,並具體講解通過這些指令來編寫定製映象的Dockerfile,以及如何生成映象。最後介紹使用Dockerfil

elasticsearch技術解析實戰(一) 入門和索引

ilog reat date str last dice elastics replicas nod GET _cat/nodes GET _cat/health GET _cat/shards GET http://10.37.84.124:9200/secislan

Elasticsearch技術解析實戰 PDF (內含目錄)

setting 4.6 2.2.3 tps 重寫 約定 系統 檢測 概念 Elasticsearch技術解析與實戰 下載地址:https://pan.baidu.com/s/1q46lwAqzbUMs0qbKyBNBqg 關註微信公眾號獲取提取碼:   輸入:esj

Elasticsearch技術解析實戰-索引

htm bulk version 繼續 多文檔 filter case || 重建 1.索引管理 創建索引 PUT http://127.0.0.1:9200/secisland { "settings": { "number_of_shards": 5,

Docker技術入門實戰 第二版-學習筆記-9-Docker Compose 專案-1-舉例說明

Docker Compose 是 Docker 官方編排(Orchestration)專案之一,負責快速在叢集中部署分散式應用 Compose 通過一個配置檔案來管理多個Docker容器,在配置檔案中,所有的容器通過services來定義,然後使用docker-compose

Docker技術入門實戰 第二版-學習筆記-8-網路功能network-1-單個host上的容器網路

Docker 中的網路功能介紹 Docker 允許通過外部訪問容器或容器互聯的方式來提供網路服務   1) 外部訪問容器

Docker技術入門實戰 第二版-學習筆記-8-網路功能network-2-相應配置

1) 快速配置指南(詳細使用下面會講) 其中有些命令選項只有在 Docker 服務啟動的時候才能配置,而且不能馬上生效 下面2個命令選項既可以在啟動服務時指定,也可以 Docker 容器啟動(doc

Docker技術入門實戰 第二版-學習筆記-8-網路功能network-3-容器訪問控制和自定義網橋

1)容器訪問控制 容器的訪問控制,主要通過 Linux 上的 iptables防火牆來進行管理和實現。 iptables是 Linux 上預設的防火牆軟體,在大部分發行版中都自帶。   容器訪問外部網路 容器要想訪問

Docker技術入門實戰 第二版-學習筆記-10-Docker Machine 專案-1-cli

Docker Machine 是 Docker 官方編排(Orchestration)專案之一,負責在多種平臺上快速安裝 Docker 環境 Docker Machine是一種工具,它允許你在虛擬主機上安裝Docker引擎,並使用docker-machine命令管理主機。