01-TensorFlow基礎
Tensorflow是什么
Google的開源軟件庫
- 采取數據流圖,用於數值計算
- 支持多種平台 - GPU、CPU、 移動設備
- 最初用於深度學習,變得越來越通用
Tensorflow數據結構
#數據流圖
-
線:節點之間的輸入輸出關系,線上運輸張量. tensor:張量- 指代數據
-
節點:operation (op): 專門運算的操作節點,所有的操作都是一個op,處理數據
- 只要使用tensorflow的API定義的函數都是OP
- 節點被分配到各種計算設備上運行
- graph: 圖 整個的程序結構
- 本質上是一個分配的內存位置,默認有一個圖,所有的tensor 和 op 的內存地址都是一樣的。
- 不同的圖內存地址不一樣,計算的過程中互不干擾
- session: 會話: 運算程序的圖 (只能運行一張圖,可以在會話中指定圖去運行 graph = g)
- 運行圖的結構
- 分配資源計算
- 掌握資源(變量、隊列、線程)
Tensorflow的特性
- 高度的靈活性,便於調用函數,也可以寫自己的封裝
- 真正的可移植性,在不同的設備上都可以簡單運行
- 產品和科研結合
- 自動求微分,主要用於反向傳播計算
- 多語言支持,C++, Java , JS, R
- 性能最優化
Tensorflow的前后端系統
- 前端系統:定義程序的圖的機構
- 后端系統: 運算圖結構
Tensorflow版本變遷
Tensorflow1.0 主要特性
- XLA: Accelerate Linear Algebra
- 提升訓練速度58倍
- 可以在移動設備上運行
- 引用更高級別的API
- tf.layers/ tf.metrics / tf.losses/ tf.keras
- Tensorflow調試器
- 支持docker鏡像,引入tensorflow serving 服務
Tensorflow 2.0 主要特性
- 使用tf.keras 和 eager mode 進行簡單模型構建
- 魯棒的跨平台模型部署
- 強大的研究實驗
- 清除了不推薦使用和重復的API
Tensorflow2.0 簡化模型開發流程
- 使用tf.data加載數據
- 使用tf.keras 構建模型,也可以使用premade estimator 驗證模型
- 使用tensorflow hub進行遷移學習
- 注: 遷移學習 - 使用一個前人預先訓練好的,應用在其他領域的網絡作為模型訓練的起點,站在前人基礎上更進一步,不必重新發明輪子。
- 使用eager mode 進行運行和調試
- 使用分發策略進行分布式訓練
- 導出到SavedModel
- 使用Tensorflow Serve, Tensorflow Lite, Tensorflow.js
Tensorflow 強大的跨平台能力
- Tensorflow 服務
- 直接通過HTTP/ TEST 或 GTPC/協議緩沖區
- Tensorflow Lite - Android, iOS 和嵌入式
- Tensorflow.js - Javascript 部署
- 其他語言
Tensorflow vs. Pytorch
入門時間(易用性)
- Tensorflow 1.*
- 靜態圖 ,構建完之后不可以更改, 效率高
- 額外概念, 會話,變量,占位符
- 寫樣本代碼
- Tensorflow 2.0
- 動態圖, 構建完之后可以更改, 效率不高,調試容易
- Eager mode 直接集成在python中
- Pytorch
- 動態圖
- numpy擴展,集成在python
"""
不同方式求解 1 + 1/2 + 1/2^2 + 1/2^3 + ...... + 1/2^50
"""
# 1. tensorflow 1.*求解
import tensorflow as tf
print(tf.__version__)
x = tf.Variable(0.)
y = tf.Variable(1.)
add_op = x.assign(x + y)
div_op = y.assign(y / 2)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for iteration in range(50):
sess.run(add_op)
sess.run(div_op)
print(x.eval())
# 2. pytorch 求解
import torch
print(torch.__version__)
x = torch.Tensor([0.])
y = torch.Tensor([1.])
for iteration in range(50):
x = x + y
y = y / 2
print(x)
# 3. tensorflow 2.0 求解
import tensorflow as tf
print(tf.__version__)
x = tf.constant(0.)
y = tf.constant(1.)
for iteration in range(50):
x = x + y
y = y / 2
print(x.numpy())
# 4. 純python求解
x = 0
y = 1
for iteration in range(50):
x = x + y
y = y / 2
print(x) # 精度有點不一樣
圖創建和調試
- Tensorflow 1.*
- 靜態圖,難以調試, 需要使用tfdbg
- Tensorflow 2.0 與 pytorch
- 動態圖,python自帶的調試工具
全面性
- python缺少少量的功能,使用頻次很低
- 沿維翻轉張量 (np.flip, np.flipud, np.fliplr)
- 檢查無窮與非數值張量(np.is_nan, np.is_inf)
- 快速傅里葉變換 (np.fft)
序列化和部署
- Tensorflow 支持更加廣泛,多語言,跨平台
- pytorch 支持比較簡單