本教程的知識點為:深度學習介紹 1.1 深度學習與機器學習的區(qū)別 TensorFlow介紹 2.4 張量 2.4.1 張量(Tensor) 2.4.1.1 張量的類型 TensorFlow介紹 1.2 神經網絡基礎 1.2.1 Logistic回歸 1.2.1.1 Logistic回歸 TensorFlow介紹 總結 每日作業(yè) 神經網絡與tf.keras 1.3 神經網絡基礎 神經網絡與tf.keras 1.3 Tensorflow實現神經網絡 1.3.1 TensorFlow keras介紹 1.3.2 案例:實現多層神經網絡進行時裝分類 神經網絡與tf.keras 1.4 深層神經網絡 為什么使用深層網絡 1.4.1 深層神經網絡表示 卷積神經網絡 3.1 卷積神經網絡(CNN)原理 為什么需要卷積神經網絡 原因之一:圖像特征數量對神經網絡效果壓力 卷積神經網絡 3.1 卷積神經網絡(CNN)原理 為什么需要卷積神經網絡 原因之一:圖像特征數量對神經網絡效果壓力 卷積神經網絡 2.2案例:CIFAR100類別分類 2.2.1 CIFAR100數據集介紹 2.2.2 API 使用 卷積神經網絡 2.4 BN與神經網絡調優(yōu) 2.4.1 神經網絡調優(yōu) 2.4.1.1 調參技巧 卷積神經網絡 2.4 經典分類網絡結構 2.4.1 LeNet-5解析 2.4.1.1 網絡結構 卷積神經網絡 2.5 CNN網絡實戰(zhàn)技巧 2.5.1 遷移學習(Transfer Learning) 2.5.1.1 介紹 卷積神經網絡 總結 每日作業(yè) 商品物體檢測項目介紹 1.1 項目演示 商品物體檢測項目介紹 3.4 Fast R-CNN 3.4.1 Fast R-CNN 3.4.1.1 RoI pooling YOLO與SSD 4.3 案例:SSD進行物體檢測 4.3.1 案例效果 4.3.2 案例需求 商品檢測數據集訓練 5.2 標注數據讀取與存儲 5.2.1 案例:xml讀取本地文件存儲到pkl 5.2.1.1 解析結構
全套筆記資料代碼移步: 前往gitee倉庫查看
感興趣的小伙伴可以自取哦~
全套教程部分目錄:
部分文件圖片:
深度學習
要求
- 熟練掌握機器學習基礎,如分類赏淌、回歸
- 熟練掌握numpy,pandas,sklearn等框架使用
目標
-
算法
掌握神經網絡的數學原理
手動實現簡單的神經網絡結構
-
應用
- 熟練掌握TensorFlow框架使用
- 掌握神經網絡圖像相關案例
深度學習介紹
1.1 深度學習與機器學習的區(qū)別
學習目標
-
目標
- 知道深度學習與機器學習的區(qū)別
-
應用
- 無
1.1.1 區(qū)別
1.1.1.1 特征提取方面
- 機器學習的特征工程步驟是要靠手動完成的,而且需要大量領域專業(yè)知識
- 深度學習通常由多個層組成挫酿,它們通常將更簡單的模型組合在一起,通過將數據從一層傳遞到另一層來構建更復雜的模型斗埂。通過大量數據的訓練自動得到模型塞琼,不需要人工設計特征提取環(huán)節(jié)坎炼。
深度學習算法試圖從數據中學習高級功能愧膀,這是深度學習的一個非常獨特的部分。因此谣光,減少了為每個問題開發(fā)新特征提取器的任務檩淋。適合用在難提取特征的圖像、語音抢肛、自然語言領域
1.1.1.2 數據量
機器學習需要的執(zhí)行時間遠少于深度學習,深度學習參數往往很龐大碳柱,需要通過大量數據的多次優(yōu)化來訓練參數捡絮。
第一、它們需要大量的訓練數據集
第二莲镣、是訓練深度神經網絡需要大量的算力
可能要花費數天福稳、甚至數周的時間,才能使用數百萬張圖像的數據集訓練出一個深度網絡瑞侮。所以以后
- 需要強大對的GPU服務器來進行計算
- 全面管理的分布式訓練與預測服務——比如[谷歌 TensorFlow 云機器學習平臺]( CPU 和 GPU
1.1.2 算法代表
-
機器學習
- 樸素貝葉斯的圆、決策樹等
-
深度學習
- 神經網絡
深度學習的應用場景
學習目標
-
目標
- 知道深度學習的主要應用場景
-
應用
- 無
-
圖像識別
- 物體識別
- 場景識別
- 車型識別
- 人臉檢測跟蹤
- 人臉關鍵點定位
- 人臉身份認證
-
自然語言處理技術
- 機器翻譯
- 文本識別
- 聊天對話
-
語音技術
- 語音識別
1.2 深度學習框架介紹
學習目標
-
目標
- 了解常見的深度學習框架
- 了解TensorFlow框架
-
應用
- 無
1.2.1 常見深度學習框架對比
tensorflow的github:
1.2.2 TensorFlow的特點
官網:[
-
語言多樣(Language Options)
- TensorFlow使用C++實現的,然后用Python封裝半火。谷歌號召社區(qū)通過SWIG開發(fā)更多的語言接口來支持TensorFlow
-
使用分發(fā)策略進行分發(fā)訓練
- 對于大型 ML 訓練任務越妈,分發(fā)策略 API使在不更改模型定義的情況下,可以輕松地在不同的硬件配置上分發(fā)和訓練模型钮糖。由于 TensorFlow 支持一系列硬件加速器梅掠,如 CPU酌住、GPU 和 TPU
-
Tensorboard可視化
- TensorBoard是TensorFlow的一組Web應用,用來監(jiān)控TensorFlow運行過程
在任何平臺上的生產中進行強大的模型部署
一旦您訓練并保存了模型阎抒,就可以直接在應用程序中執(zhí)行它酪我,或者使用部署庫為其提供服務:
- [TensorFlow 服務]( HTTP/REST 或 GRPC/協(xié)議緩沖區(qū)提供服務的 TensorFlow 庫構建。
- [TensorFlow Lite]( 針對移動和嵌入式設備的輕量級解決方案提供了在 Android且叁、iOS 和嵌入式系統(tǒng)上部署模型的能力都哭。
- [tensorflow.js]( JavaScript 環(huán)境中部署模型,例如在 Web 瀏覽器或服務器端通過 Node.js 部署模型逞带。TensorFlow.js 還支持在 JavaScript 中定義模型欺矫,并使用類似于 Kera 的 API 直接在 Web 瀏覽器中進行訓練。
1.2.3 TensorFlow的安裝
安裝 TensorFlow在64 位系統(tǒng)上測試這些系統(tǒng)支持 TensorFlow:
- Ubuntu 16.04 或更高版本
- Windows 7 或更高版本
- macOS 10.12.6 (Sierra) 或更高版本(不支持 GPU)
進入虛擬環(huán)境當中再安裝掰担。剛開始的環(huán)境比較簡單汇陆,只要下載tensorflow即可
- 環(huán)境包:
安裝較慢,指定鏡像源带饱,請在帶有numpy等庫的虛擬環(huán)境中安裝
- ubuntu安裝
pip install tensorflow==1.12 -i
- MacOS安裝
pip install tensorflow==1.12 -i
注:如果需要下載GPU版本的(TensorFlow只提供windows和linux版本的毡代,沒有Macos版本的)參考官網[
1、虛擬機下linux也是用不了GPU版本TensorFlow
2勺疼、本機單獨的windows和本機單獨的unbuntu可以使用GPU版本TensorFlow教寂,需要安裝相關驅動
1.2.4 Tenssorlfow使用技巧
- 使用**[tf.keras](
- tensorflow提供模型訓練模型部署
TensorFlow介紹
說明TensorFlow的數據流圖結構
應用TensorFlow操作圖
說明會話在TensorFlow程序中的作用
應用TensorFlow實現張量的創(chuàng)建、形狀類型修改操作
應用Variable實現變量op的創(chuàng)建
應用Tensorboard實現圖結構以及張量值的顯示
應用tf.train.saver實現TensorFlow的模型保存以及加載
應用tf.app.flags實現命令行參數添加和使用
應用TensorFlow實現線性回歸
2.1 TF數據流圖
學習目標
-
目標
- 說明TensorFlow的數據流圖結構
-
應用
- 無
-
內容預覽
-
2.1.1 案例:TensorFlow實現一個加法運算
- 1 代碼
- 2 TensorFlow結構分析
2.1.2 數據流圖介紹
-
2.1.1 案例:TensorFlow實現一個加法運算
2.1.1.1 代碼
def tensorflow_demo():
"""
通過簡單案例來了解tensorflow的基礎結構
:return: None
"""
# 一执庐、原生python實現加法運算
a = 10
b = 20
c = a + b
print("原生Python實現加法運算方法1:\n", c)
def add(a, b):
return a + b
sum = add(a, b)
print("原生python實現加法運算方法2:\n", sum)
# 二酪耕、tensorflow實現加法運算
a_t = tf.constant(10)
b_t = tf.constant(20)
# 不提倡直接運用這種符號運算符進行計算
# 更常用tensorflow提供的函數進行計算
# c_t = a_t + b_t
c_t = tf.add(a_t, b_t)
print("tensorflow實現加法運算:\n", c_t)
# 如何讓計算結果出現?
# 開啟會話
with tf.Session() as sess:
sum_t = sess.run(c_t)
print("在sess當中的sum_t:\n", sum_t)
return None
注意問題:警告指出你的CPU支持AVX運算加速了線性代數計算轨淌,即點積迂烁,矩陣乘法,卷積等递鹉∶瞬剑可以從源代碼安裝TensorFlow來編譯,當然也可以選擇關閉
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
2.1.1.2 TensorFlow結構分析
TensorFlow 程序通常被組織成一個構建圖階段和一個執(zhí)行圖階段躏结。
在構建階段却盘,數據與操作的執(zhí)行步驟被描述成一個圖。
在執(zhí)行階段媳拴,使用會話執(zhí)行構建好的圖中的操作黄橘。
-
圖和會話 :
- 圖:這是 TensorFlow 將計算表示為指令之間的依賴關系的一種表示法
- 會話:TensorFlow 跨一個或多個本地或遠程設備運行數據流圖的機制
張量:TensorFlow 中的基本數據對象
節(jié)點:提供圖當中執(zhí)行的操作
2.1.2 數據流圖介紹
<figure class="half">TensorFlow是一個采用數據流圖(data flow graphs),用于數值計算的開源框架屈溉。
節(jié)點(Operation)在圖中表示數學操作塞关,線(edges)則表示在節(jié)點間相互聯系的多維數據數組,即張量(tensor)子巾。
TensorFlow介紹
說明TensorFlow的數據流圖結構
應用TensorFlow操作圖
說明會話在TensorFlow程序中的作用
應用TensorFlow實現張量的創(chuàng)建描孟、形狀類型修改操作
應用Variable實現變量op的創(chuàng)建
應用Tensorboard實現圖結構以及張量值的顯示
應用tf.train.saver實現TensorFlow的模型保存以及加載
應用tf.app.flags實現命令行參數添加和使用
應用TensorFlow實現線性回歸
2.2 圖與TensorBoard
學習目標
-
目標
- 說明圖的基本使用
- 應用tf.Graph創(chuàng)建圖驶睦、tf.get_default_graph獲取默認圖
- 知道開啟TensorBoard過程
- 知道圖當中op的名字以及命名空間
-
應用
- 無
-
內容預覽
2.2.1 什么是圖結構
-
2.2.2 圖相關操作
- 1 默認圖
- 2 創(chuàng)建圖
-
2.2.3 TensorBoard:可視化學習
- 1 數據序列化-events文件
- 2 啟動TensorBoard
-
2.2.4 OP
- 1 常見OP
- 2 指令名稱
2.2.1 什么是圖結構
圖包含了一組tf.Operation代表的計算單元對象和tf.Tensor代表的計算單元之間流動的數據。
2.2.2 圖相關操作
1 默認圖
通常TensorFlow會默認幫我們創(chuàng)建一張圖匿醒。
查看默認圖的兩種方法:
- 通過調用tf.get_default_graph()訪問 场航,要將操作添加到默認圖形中,直接創(chuàng)建OP即可廉羔。
- op溉痢、sess都含有graph屬性 ,默認都在一張圖中
def graph_demo():
# 圖的演示
a_t = tf.constant(10)
b_t = tf.constant(20)
# 不提倡直接運用這種符號運算符進行計算
# 更常用tensorflow提供的函數進行計算
# c_t = a_t + b_t
c_t = tf.add(a_t, b_t)
print("tensorflow實現加法運算:\n", c_t)
# 獲取默認圖
default_g = tf.get_default_graph()
print("獲取默認圖:\n", default_g)
# 數據的圖屬性
print("a_t的graph:\n", a_t.graph)
print("b_t的graph:\n", b_t.graph)
# 操作的圖屬性
print("c_t的graph:\n", c_t.graph)
# 開啟會話
with tf.Session() as sess:
sum_t = sess.run(c_t)
print("在sess當中的sum_t:\n", sum_t)
# 會話的圖屬性
print("會話的圖屬性:\n", sess.graph)
return None
2 創(chuàng)建圖
可以通過tf.Graph()自定義創(chuàng)建圖
如果要在這張圖中創(chuàng)建OP憋他,典型用法是使用tf.Graph.as_default()上下文管理器
def graph_demo():
# 圖的演示
a_t = tf.constant(10)
b_t = tf.constant(20)
# 不提倡直接運用這種符號運算符進行計算
# 更常用tensorflow提供的函數進行計算
# c_t = a_t + b_t
c_t = tf.add(a_t, b_t)
print("tensorflow實現加法運算:\n", c_t)
# 獲取默認圖
default_g = tf.get_default_graph()
print("獲取默認圖:\n", default_g)
# 數據的圖屬性
print("a_t的graph:\n", a_t.graph)
print("b_t的graph:\n", b_t.graph)
# 操作的圖屬性
print("c_t的graph:\n", c_t.graph)
# 自定義圖
new_g = tf.Graph()
print("自定義圖:\n", new_g)
# 在自定義圖中去定義數據和操作
with new_g.as_default():
new_a = tf.constant(30)
new_b = tf.constant(40)
new_c = tf.add(new_a, new_b)
# 數據的圖屬性
print("new_a的graph:\n", new_a.graph)
print("new_b的graph:\n", new_b.graph)
# 操作的圖屬性
print("new_c的graph:\n", new_c.graph)
# 開啟會話
with tf.Session() as sess:
sum_t = sess.run(c_t)
print("在sess當中的sum_t:\n", sum_t)
# 會話的圖屬性
print("會話的圖屬性:\n", sess.graph)
# 不同的圖之間不能互相訪問
# sum_new = sess.run(new_c)
# print("在sess當中的sum_new:\n", sum_new)
with tf.Session(graph=new_g) as sess2:
sum_new = sess2.run(new_c)
print("在sess2當中的sum_new:\n", sum_new)
print("會話的圖屬性:\n", sess2.graph)
# 很少會同時開啟不同的圖孩饼,一般用默認的圖就夠了
return None
TensorFlow有一個亮點就是,我們能看到自己寫的程序的可視化效果竹挡,這個功能就是Tensorboard镀娶。在這里我們先簡單介紹一下其基本功能。
2.2.3 TensorBoard:可視化學習
TensorFlow 可用于訓練大規(guī)模深度神經網絡所需的計算揪罕,使用該工具涉及的計算往往復雜而深奧梯码。為了更方便 TensorFlow 程序的理解、調試與優(yōu)化好啰,TensorFlow提供了TensorBoard 可視化工具轩娶。
實現程序可視化過程:
1 數據序列化-events文件
TensorBoard 通過讀取 TensorFlow 的事件文件來運行,需要將數據生成一個序列化的 Summary protobuf 對象框往。
# 返回filewriter,寫入事件文件到指定目錄(最好用絕對路徑)鳄抒,以提供給tensorboard使用
tf.summary.FileWriter('./tmp/summary/test/', graph=sess.graph)
這將在指定目錄中生成一個 event 文件,其名稱格式如下:
events.out.tfevents.{timestamp}.{hostname}
2 啟動TensorBoard
tensorboard --logdir="./tmp/tensorflow/summary/test/"
在瀏覽器中打開 TensorBoard 的圖頁面 [127.0.0.1:6006](
2.2.4 OP
2.2.4.1 常見OP
哪些是OP椰弊?
類型 | 實例 |
---|---|
標量運算 | add, sub, mul, div, exp, log, greater, less, equal |
向量運算 | concat, slice, splot, constant, rank, shape, shuffle |
矩陣運算 | matmul, matrixinverse, matrixdateminant |
帶狀態(tài)的運算 | Variable, assgin, assginadd |
神經網絡組件 | softmax, sigmoid, relu,convolution,max_pool |
存儲, 恢復 | Save, Restroe |
隊列及同步運算 | Enqueue, Dequeue, MutexAcquire, MutexRelease |
控制流 | Merge, Switch, Enter, Leave, NextIteration |
一個操作對象(Operation)是TensorFlow圖中的一個節(jié)點, 可以接收0個或者多個輸入Tensor, 并且可以輸出0個或者多個Tensor许溅,Operation對象是通過op構造函數(如tf.matmul())創(chuàng)建的。
例如: c = tf.matmul(a, b) 創(chuàng)建了一個Operation對象秉版,類型為 MatMul類型, 它將張量a, b作為輸入贤重,c作為輸出,,并且輸出數據沐飘,打印的時候也是打印的數據游桩。其中tf.matmul()是函數牲迫,在執(zhí)行matmul函數的過程中會通過MatMul類創(chuàng)建一個與之對應的對象
# 實現一個加法運算
con_a = tf.constant(3.0)
con_b = tf.constant(4.0)
sum_c = tf.add(con_a, con_b)
print("打印con_a:\n", con_a)
print("打印con_b:\n", con_b)
print("打印sum_c:\n", sum_c)
打印語句會生成:
打印con_a:
Tensor("Const:0", shape=(), dtype=float32)
打印con_b:
Tensor("Const_1:0", shape=(), dtype=float32)
打印sum_c:
Tensor("Add:0", shape=(), dtype=float32)
注意耐朴,打印出來的是張量值,可以理解成OP當中包含了這個值盹憎。并且每一個OP指令都對應一個唯一的名稱筛峭,如上面的Const:0,這個在TensorBoard上面也可以顯示
請注意陪每,tf.Tensor 對象以輸出該張量的 tf.Operation 明確命名影晓。張量名稱的形式為 "<OP_NAME>:<i>"镰吵,其中:
- "<OP_NAME>" 是生成該張量的指令的名稱
- "<i>" 是一個整數,它表示該張量在指令的輸出中的索引
2.2.4.2 指令名稱
tf.Graph對象為其包含的 tf.Operation對象定義的一個命名空間挂签。TensorFlow 會自動為圖中的每個指令選擇一個唯一名稱疤祭,用戶也可以指定描述性名稱,使程序閱讀起來更輕松饵婆。我們可以以以下方式改寫指令名稱
- 每個創(chuàng)建新的 tf.Operation 或返回新的 tf.Tensor 的 API 函數可以接受可選的 name 參數勺馆。
例如,tf.constant(42.0, name="answer") 創(chuàng)建了一個名為 "answer" 的新 tf.Operation 并返回一個名為 "answer:0" 的 tf.Tensor侨核。如果默認圖已包含名為 "answer" 的指令草穆,則 TensorFlow 會在名稱上附加 "1"、"2" 等字符搓译,以便讓名稱具有唯一性悲柱。
- 當修改好之后,我們在Tensorboard顯示的名字也會被修改
a = tf.constant(3.0, name="a")
b = tf.constant(4.0, name="b" )
2.3 會話
學習目標
-
目標
- 應用sess.run或者eval運行圖程序并獲取張量值
- 應用feed_dict機制實現運行時填充數據
- 應用placeholder實現創(chuàng)建占位符
-
應用
- 無
-
內容預覽
-
2.3.1 會話
- 1 init(target='', graph=None, config=None)
- 2 會話的run()
- 3 feed操作
-
2.3.1 會話
一個運行TensorFlow operation的類些己。會話包含以下兩種開啟方式
- tf.Session:用于完整的程序當中
- tf.InteractiveSession:用于交互式上下文中的TensorFlow 豌鸡,例如shell
1 TensorFlow 使用 tf.Session 類來表示客戶端程序(通常為 Python 程序,但也提供了使用其他語言的類似接口)與 C++ 運行時之間的連接
2 tf.Session 對象使用分布式 TensorFlow 運行時提供對本地計算機中的設備和遠程設備的訪問權限轴总。
2.3.1.1 init(target='', graph=None, config=None)
會話可能擁有的資源直颅,如 tf.Variable,tf.QueueBase和tf.ReaderBase怀樟。當這些資源不再需要時功偿,釋放這些資源非常重要。因此往堡,需要調用tf.Session.close會話中的方法械荷,或將會話用作上下文管理器。以下兩個例子作用是一樣的:
def session_demo():
"""
會話演示
:return:
"""
a_t = tf.constant(10)
b_t = tf.constant(20)
# 不提倡直接運用這種符號運算符進行計算
# 更常用tensorflow提供的函數進行計算
# c_t = a_t + b_t
c_t = tf.add(a_t, b_t)
print("tensorflow實現加法運算:\n", c_t)
# 開啟會話
# 傳統(tǒng)的會話定義
# sess = tf.Session()
# sum_t = sess.run(c_t)
# print("sum_t:\n", sum_t)
# sess.close()
# 開啟會話
with tf.Session() as sess:
# sum_t = sess.run(c_t)
# 想同時執(zhí)行多個tensor
print(sess.run([a_t, b_t, c_t]))
# 方便獲取張量值的方法
# print("在sess當中的sum_t:\n", c_t.eval())
# 會話的圖屬性
print("會話的圖屬性:\n", sess.graph)
return None
- target:如果將此參數留空(默認設置)虑灰,會話將僅使用本地計算機中的設備吨瞎。可以指定 grpc:// 網址穆咐,以便指定 TensorFlow 服務器的地址颤诀,這使得會話可以訪問該服務器控制的計算機上的所有設備。
- graph:默認情況下对湃,新的 tf.Session 將綁定到當前的默認圖崖叫。
- config:此參數允許您指定一個 tf.ConfigProto 以便控制會話的行為。例如拍柒,ConfigProto協(xié)議用于打印設備使用信息
# 運行會話并打印設備信息
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
log_device_placement=True))
會話可以分配不同的資源在不同的設備上運行心傀。
/job:worker/replica:0/task:0/device:CPU:0
device_type:類型設備(例如CPU,GPU拆讯,TPU)
2.3.1.2 會話的run()
-
run(fetches,feed_dict=None, options=None, run_metadata=None)
通過使用sess.run()來運行operation
fetches:單一的operation脂男,或者列表养叛、元組(其它不屬于tensorflow的類型不行)
-
feed_dict:參數允許調用者覆蓋圖中張量的值,運行時賦值
- 與tf.placeholder搭配使用宰翅,則會檢查值的形狀是否與占位符兼容弃甥。
使用tf.operation.eval()也可運行operation,但需要在會話中運行
# 創(chuàng)建圖
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# 創(chuàng)建會話
sess = tf.Session()
# 計算C的值
print(sess.run(c))
print(c.eval(session=sess))
2.3.1.3 feed操作
- placeholder提供占位符汁讼,run時候通過feed_dict指定參數
def session_run_demo():
"""
會話的run方法
:return:
"""
# 定義占位符
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
sum_ab = tf.add(a, b)
print("sum_ab:\n", sum_ab)
# 開啟會話
with tf.Session() as sess:
print("占位符的結果:\n", sess.run(sum_ab, feed_dict={a: 3.0, b: 4.0}))
return None
請注意運行時候報的錯誤error:
RuntimeError:如果這Session是無效狀態(tài)(例如已關閉)潘飘。
TypeError:如果fetches或者feed_dict鍵的類型不合適。
ValueError:如果fetches或feed_dict鍵無效或引用 Tensor不存在的鍵掉缺。