文章目錄
深度學習
深度學習介紹
深度學習與機器學習的區別
- 特徵提取方面
- 機器學習:特徵工程步驟是手動完成的,需要大量的專業領域知識
- 深度學習:通常由多個層組成,他們通常將更簡單的模型組合在一起,將數據從一層傳遞到另一層來構建更復雜的模型。通過大量數據自動得出模型,不需要人工特徵提取環節
- 數據量和計算i性能要求方面
- 機器學習:隨着數據量的增加,模型性能會有瓶頸
- 深度學習:隨着數據量的增加,模型的性能會越來越好,但是深度學需要大量的算力
- 算法代表方面
- 機器學習:樸素貝葉斯、決策樹等
- 深度學習:神經網絡
深度學習的應用場景:
- 圖像識別
- 自然語言處理
- 語音技術
深度學習框架介紹
- PyTorch和Torch 更適用於學術研究;TensorFlow、Caffe、Caffe2 更適用於工業界的生產環境部署
- Caffe 適用於處理靜態圖像; Torch和PyTorch 更適用於動態圖像;TensorFlow 在兩種情況下都很實用
- TensorFlow 和 Caffe 可在移動端使用
TensorFlow 的特點
- 高度靈活
- 語言多樣
- 設備支撐
- TensorFlow 可視化
TensorFlow 的安裝
- CPU 版本
- GPU 版本
- 兩個版本的比較
- CPU:諸葛亮
- 綜合能力比較強
- 核芯的數量更少
- 更適用於處理連續性(sequential)任務。
- GPU:臭皮匠
- 專做某一個事情很好
- 核芯的數量更多
- 更適用於並行(parallel)任務
- CPU:諸葛亮
TensorFlow 框架介紹
TF 數據流圖
- TensorFlow結構分析
- 構建圖階段
- 流程圖:定義數據(張量Tensor)和操作(節點Op)
- 執行圖階段
- 調用各方資源,將定義好的數據和操作運行起來
- 構建圖階段
- 數據流圖介紹
- Tensor - 張量 - 數據
- Flow - 流動
圖與TensorBoard
- 什麼是圖結構
- 數據(Tensor) + 操作(Operation)
- 圖相關操作
- 默認圖
- 查看默認圖的方法
- 調用方法
- 用tf.get_default_graph()
- 查看屬性
- .graph
- 調用方法
- 查看默認圖的方法
- 創建圖
- new_g = tf.Graph()
with new_g.as_default():
定義數據和操作
- new_g = tf.Graph()
- 默認圖
- TensorBoard:可視化學習
- 數據序列化-events文件
- tf.summary.FileWriter(path, graph=sess.graph)
- 啓動tensorboard
- 數據序列化-events文件
- OP
- 數據:Tensor對象
操作:Operation對象 - Op - 常見OP
- 操作函數 & 操作對象
tf.constant(Tensor對象) 輸入Tensor對象 -Const-輸出 Tensor對象
tf.add(Tensor對象1, Tensor對象2) 輸入Tensor對象1, Tensor對象2 - Add對象 - 輸出 Tensor對象3
- 操作函數 & 操作對象
- 指令名稱
- 一張圖 - 一個命名空間
- 數據:Tensor對象
會話
- tf.Session:用於完整的程序當中
tf.InteractiveSession:用於交互式上下文中的TensorFlow ,例如shell - 會話掌握資源,用完要回收 - 上下文管理器
- 初始化會話對象時的參數
- graph=None
target:如果將此參數留空(默認設置),
會話將僅使用本地計算機中的設備。
可以指定 grpc:// 網址,以便指定 TensorFlow 服務器的地址,
這使得會話可以訪問該服務器控制的計算機上的所有設備。
config:此參數允許您指定一個 tf.ConfigProto
以便控制會話的行爲。例如,ConfigProto協議用於打印設備使用信息
- graph=None
- run(fetches,feed_dict=None)
- feed操作
- a = tf.placeholder(tf.float32, shape=)
b = tf.placeholder(tf.float32, shape=)
- a = tf.placeholder(tf.float32, shape=)
張量Tensor
- 張量(Tensor)
- 張量 在計算機當中如何存儲?
- 標量 一個數字 0階張量
向量 一維數組 [2, 3, 4] 1階張量
矩陣 二維數組 [[2, 3, 4], 2階張量
[2, 3, 4]]
……
張量 n維數組 n階張量
- 標量 一個數字 0階張量
- 張量的類型(dtype)
- 創建張量的時候,如果不指定類型
默認 tf.float32
整型 tf.int32
浮點型 tf.float32
- 創建張量的時候,如果不指定類型
- 張量的階(shape)
- 張量 在計算機當中如何存儲?
- 創建張量的指令
- tf.zeros(shape=( * , * ))
- tf.ones(shape = ( * , * ))
- tf.canstant()
- 張量的變換
- 類型的修改
- 1)ndarray.astype(type)
tf.cast(tensor, dtype = *)
不會改變原始的tensor
返回新的改變類型後的tensor
2)ndarray.tostring()
- 1)ndarray.astype(type)
- 形狀的修改
- 靜態形狀 - 初始創建張量時的形狀
- 什麼情況下才可以改變/更新靜態形狀?
只有在形狀沒有完全固定下來的情況下
tensor.set_shape(shape)
- 什麼情況下才可以改變/更新靜態形狀?
- 如何改變動態形狀
- tf.reshape(tensor, shape)
不會改變原始的tensor
返回新的改變形狀後的tensor
動態創建新張量時,張量的元素個數必須匹配
- tf.reshape(tensor, shape)
- 靜態形狀 - 初始創建張量時的形狀
- 張量的數學運算
- 類型的修改
變量OP
- 特點
- 存儲持久化
- 可修改值
- 可指定被訓練
- 作用:存儲模型參數
- 具體使用
- 變量需要顯式初始化,才能運行值
- 使用tf.variable_scope()修改變量的命名空間
- 使得結構更加清晰
高級API
- 其他基礎API
- 高級API
- 關於TensorFlow的API圖示
案例:實現線性迴歸
- 線性迴歸原理複習
- 1)構建模型
y = w1x1 + w2x2 + …… + wnxn + b
2)構造損失函數
均方誤差
3)優化損失
梯度下降
- 1)構建模型
- 案例:實現線性迴歸的訓練
- 準備真實數據
100樣本
x 特徵值 形狀 (100, 1)
y_true 目標值 (100, 1)
y_true = 0.8x + 0.7 - 假定x 和 y 之間的關係 滿足
y = kx + b
k ≈ 0.8 b ≈ 0.7 - 流程分析:
(100, 1) * (1, 1) = (100, 1)
y_predict = x * weights(1, 1) + bias(1, 1)
1)構建模型
y_predict = tf.matmul(x, weights) + bias
2)構造損失函數
error = tf.reduce_mean(tf.square(y_predict - y_true))
3)優化損失
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
5 學習率的設置、步數的設置與梯度爆炸
- 準備真實數據
- 增加其他功能
- 增加變量顯示
- 1)創建事件文件
- 2)收集變量
- 3)合併變量
- 4)每次迭代運行一次合併變量
- 5)每次迭代將summary對象寫入事件文件
- 增加命名空間
- 使代碼結構更加清晰,TensorBoard 圖結構更清楚
- 模型的保存與加載
- saver = tf.train.Saver(var_list=None,max_to_keep=5)
1)實例化Saver
2)保存
saver.save(sess, path)
3)加載
saver.restore(sess, path)
- saver = tf.train.Saver(var_list=None,max_to_keep=5)
- 命令行參數的使用
- 使用方式
- 步驟
- 1)tf.app.flags
tf.app.flags.DEFINE_integer(“max_step”, 0, “訓練模型的步數”)
tf.app.flags.DEFINE_string(“model_dir”, " ", “模型保存的路徑+模型名字”)
2)FLAGS = tf.app.flags.FLAGS
通過FLAGS.max_step調用命令行中傳過來的參數
3、通過tf.app.run()啓動main(argv)函數
- 1)tf.app.flags
- 增加變量顯示
數據讀取、神經網絡基礎
文件讀取流程
- 多線程 + 隊列
- 文件讀取流程
- 1)構造文件名隊列
- file_queue = tf.train.string_input_producer(string_tensor,shuffle=True)
- 2)讀取與解碼
- 文本:
讀取:tf.TextLineReader()
解碼:tf.decode_csv()
圖片:
讀取:tf.WholeFileReader()
解碼:
tf.image.decode_jpeg(contents)
tf.image.decode_png(contents)
二進制:
讀取:tf.FixedLengthRecordReader(record_bytes)
解碼:tf.decode_raw()
TFRecords
讀取:tf.TFRecordReader()
key, value = 讀取器.read(file_queue)
key:文件名
value:一個樣本
- 文本:
- 3)批處理隊列
- tf.train.batch(tensors, batch_size, num_threads = 1, capacity = 32, name=None)
- 手動開啓線程
- tf.train.QueueRunner()
開啓會話:
tf.train.start_queue_runners(sess=None, coord=None)
- tf.train.QueueRunner()
- 1)構造文件名隊列
圖片數據
- 圖像基本知識
- 文本 特徵詞 -> 二維數組
字典 one-hot -> 二維數組
圖片 像素值 - 圖片三要素
- 長度、寬度、通道數
- 黑白圖、灰度圖
一個通道 - 彩色圖
三個通道
- 黑白圖、灰度圖
- 長度、寬度、通道數
- TensorFlow中表示圖片
- Tensor對象
指令名稱、形狀、類型
shape = [height, width, channel]
- Tensor對象
- 圖片特徵值處理
- [samples, features]
爲什麼要縮放圖片到統一大小?
1)每一個樣本特徵數量要一樣多
2)縮小圖片的大小
tf.image.resize_images(images, size)
- [samples, features]
- 數據格式
- 存儲:uint8
訓練:float32
- 存儲:uint8
- 文本 特徵詞 -> 二維數組
- 案例:狗圖片讀取
- 1)構造文件名隊列
file_queue = tf.train.string_input_producer(string_tensor,shuffle=True)
2)讀取與解碼
讀取:
reader = tf.WholeFileReader()
key, value = reader.read(file_queue)
解碼:
image_decoded = tf.image.decode_jpeg(value)
3)批處理隊列
image_decoded = tf.train.batch([image_decoded], 100, num_threads = 2, capacity=100)
手動開啓線程
- 1)構造文件名隊列
二進制數據
-
tensor對象
shape:[height, width, channel] -> [32, 32, 3] [0, 1, 2] -> []
[[32 * 32的二維數組],
[32 * 32的二維數組],
[32 * 32的二維數組]]
–> [3, 32, 32] [channel, height, width] 三維數組的轉置 [0, 1, 2] -> [1, 2, 0]
[3, 2] -轉置-> [2, 3]
1)NHWC與NCHW
T = transpose 轉置3.3.2 CIFAR10 二進制數據讀取
流程分析:
1)構造文件名隊列
2)讀取與解碼
3)批處理隊列
開啓會話
手動開啓線程
TFRecords
- TFRecords 文件
- 定義
- TFRecords 其實是一種二進制文件,雖然它不如其他格式好理解,但是它能更好的利用內存,更方便複製和移動,並且不需要單獨的標籤文件
- 使用步驟
- 定義
- Example 結構解析
- 使用步驟
- 讀取TFRecords 文件API
- 1)構造文件名隊列
2)讀取和解碼
讀取
解析example
feature = tf.parse_single_example(value, features={
“image”:tf.FixedLenFeature([], tf.string),
“label”:tf.FixedLenFeature([], tf.int64)
})
image = feature[“image”]
label = feature[“label”]
解碼
tf.decode_raw()
3)構造批處理隊列
- 1)構造文件名隊列
神經網絡基礎
- 神經網絡
- 輸入層
- 隱藏層
- 輸出層
- 感知機
- 可以解決 “ 與 ” 、 “ 或 ” 問題 , 不能解決 “ 異或問題 ”
神經網絡原理
- 邏輯迴歸
y = w1x1 + w2x2 + …… + wnxn + b
sigmoid -> [0, 1] -> 二分類問題
損失函數:對數似然損失
用神經網絡進行分類
假設函數
y_predict =
softmax - 多分類問題
構造損失函數
loss = 交叉熵損失
優化損失
梯度下降
3.6.1 softmax迴歸 - 多分類問題
假設要進行三分類
2.3, 4.1, 5.6
3.6.2 交叉熵損失
案例:Mnist手寫數字識別
- Mnist 數據獲取API
線性神經網絡侷限性
卷積神經網絡
卷積神經網絡簡介
- 與傳統多層神經網絡對比
- 發展歷史
- 卷積網絡在ImageNet比賽錯誤率
卷積神經網絡原理
- 結構(隱藏層)
- 卷積層
通過在原始圖像上平移來提取特徵
激活層
增加非線性分割能力
池化層(pooling layer)/下采樣(subsample)
減少學習的參數,降低網絡的複雜度(最大池化和平均池化)
全連接層
- 卷積層
- 卷積層
- 每層卷積層都是由若干卷積單元(卷積核)組成,每個卷積單元的參數都是通過反向傳播算法最佳化得到的
- 卷積運算的目的是特徵提取,第一層卷積層可能只能提取一些低級的特徵,如邊緣、線條和角等層級,更多層的網絡能從低級特徵中迭代提取更復雜的特徵
- 卷積核(filter/過濾器/模型參數/卷積單元)
- 四大要素
- 卷積核個數
- 卷積核大小
- 通常設置爲:11、33、5*5
- 卷積核步長
- 卷積核零填充大小
- 四大要素
- 總結 - 輸出大小計算公式
- 卷積網絡API
- 激活函數
- ReLU = max(0,x)
- 函數圖像
- 效果圖
- 採用新的激活函數的原因
- 激活函數API
- ReLU = max(0,x)
- 池化層
- 主要作用
- 特徵提取,減少參數數量
- 主要方法
- max_pooling : 取池化窗口的最大值
- avg_pooling:取池化窗口的平均值
- 利用了圖像上像素點之間的聯繫
- 池化層API
- 主要作用
- 全連接層
- 主要作用
- “ 分類器 ”
- 主要作用