計算機視覺筆記總目錄
1.tf.keras 獲取資料集
Keras API 以 tf.keras 的形式包裝在 TensorFlow 中,
時裝分類Mnist資料集:
60,000張28x28總共10個類別的灰色圖片,10,000張用于測驗,
from keras.datasets import fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
- 回傳兩個元組:
x_train, x_test:uint8 陣串列示的灰度影像,尺寸為 (num_samples, 28, 28),
y_train, y_test:uint8 陣串列示的數字標簽(范圍在 0-9 之間的整數),尺寸為 (num_samples,),
2.Tensorflow 計算
TensorFlow 視為一個科學計算庫,匯入TensorFlow
import tensorflow as tf
TensorFlow 使用 張量 (Tensor) 作為資料的基本單位,TensorFlow 的張量在概念上等同于多維陣列,我們可以使用它來描述數學中的標量(0 維陣列)、向量(1 維陣列)、矩陣(2 維陣列)等各種量,示例如下:
# 定義一個亂數(標量)
random_float = tf.random.uniform(shape=())
# 定義一個有2個元素的零向量
zero_vector = tf.zeros(shape=(2))
# 定義兩個2×2的常量矩陣
A = tf.constant([[1., 2.], [3., 4.]])
B = tf.constant([[5., 6.], [7., 8.]])
張量的重要屬性是其形狀、型別和值,可以通過張量的 shape 、 dtype 屬性和 numpy() 方法獲得,例如:
# 查看矩陣A的形狀、型別和值
print(A.shape) # 輸出(2, 2),即矩陣的長和寬均為2
print(A.dtype) # 輸出<dtype: 'float32'>
print(A.numpy()) # 輸出[[1. 2.]
# [3. 4.]]
2.1 張量的型別

2.2 張量的階

形狀有0階、1階、2階….
tensor1 = tf.constant(4.0)
tensor2 = tf.constant([1, 2, 3, 4])
linear_squares = tf.constant([[4], [9], [16], [25]], dtype=tf.int32)
print(tensor1.shape)
# 0維:() 1維:(10, ) 2維:(3, 4) 3維:(3, 4, 5)
3.張量操作
固定值張量

隨機值張量

張量的變換
- 型別變換

- 張量的數學運算
- 算術運算子
- 基本數學函式
- 矩陣運算
- reduce操作
- 序列索引操作
參考官網鏈接
4.自動求導機制
在機器學習中,我們經常需要計算函式的導數,TensorFlow 提供了強大的自動求導機制來計算導數,
1、使用 tf.GradientTape() 計算函式
y
(
x
)
=
x
2
y(x)=x^{2}
y(x)=x2?? 在3時的導數:
import tensorflow as tf
x = tf.Variable(initial_value=3.)
with tf.GradientTape() as tape: # 在 tf.GradientTape() 的背景關系內,所有計算步驟都會被記錄以用于求導
y = tf.square(x)
y_grad = tape.gradient(y, x) # 計算y關于x的導數
print([y, y_grad])
輸出:
[array([9.], dtype=float32), array([6.], dtype=float32)]
-
1、這里x是一個初始化為 3 的 變數 (Variable),使用
tf.Variable()宣告,與普通張量一樣,變數同樣具有形狀、型別和值三種屬性,使用變數需要有一個初始化程序,可以通過在 tf.Variable()中指定initial_value引數來指定初始值,- 變數與普通張量的一個重要區別是其默認能夠被 TensorFlow 的自動求導機制所求導,因此往往被用于定義機器學習模型的引數,
-
tf.GradientTape()是一個自動求導的記錄器,在其中的變數和計算步驟都會被自動記錄,在上面的示例中,變數 x和計算步驟y = tf.square(x)被自動記錄,因此可以通過y_grad = tape.gradient(y, x)求張量 y 對變數 x 的導數,
2、多元函式求導
通常我們實際應用中更多的是對多元函式求偏導數,以及對向量或矩陣的求導,如下面例子:
L
=
1
2
?
∑
(
(
X
?
w
)
+
b
?
y
)
2
L = \frac{1}{2} * \sum((X*w) + b - y)^2
L=21??∑((X?w)+b?y)2
X = tf.constant([[1, 2], [3., 4.]])
y = tf.constant([[1], [2.]])
w = tf.Variable(initial_value=[[1.], [2.]])
b = tf.Variable(initial_value=1.)
with tf.GradientTape() as tape:
L = 0.5 * tf.reduce_sum(tf.square(tf.matmul(X, w) + b - y))
w_grad, b_grad = tape.gradient(L, [w, b])
print([L.numpy(), w_grad.numpy(), b_grad.numpy()])
輸出:
[62.5, array([[35.],
[50.]], dtype=float32), 15.0]
求導公式如下:

tf.reduce_sum()操作代表對輸入張量的所有元素求和,輸出一個形狀為空的純量張量(可以通過 axis 引數來指定求和的維度,不指定則默認對所有元素求和)
5.案例:線性回歸
考慮一個實際問題,某城市在 2013 年 - 2017 年的房價如下表所示:
| 年份 | 2013 | 2014 | 2015 | 2016 | 2017 |
|---|---|---|---|---|---|
| 房價 | 12000 | 14000 | 15000 | 16500 | 17500 |
現在,我們希望通過對該資料進行線性回歸,即使用線性模型 y = a x + b y = ax + b y=ax+b 來擬合上述資料,此處 a a a 和 b b b 是待求的引數,首先,我們定義資料,進行基本的歸一化操作,
import numpy as np
X_raw = np.array([2013, 2014, 2015, 2016, 2017], dtype=np.float32)
y_raw = np.array([12000, 14000, 15000, 16500, 17500], dtype=np.float32)
X = (X_raw - X_raw.min()) / (X_raw.max() - X_raw.min())
y = (y_raw - y_raw.min()) / (y_raw.max() - y_raw.min())
TensorFlow 下的線性回歸:
TensorFlow 的 Eager Execution(動態圖) 模式與 NumPy 的運行方式十分類似,然而提供了更快速的運算(GPU 支持)、自動求導、優化器等一系列對深度學習非常重要的功能,
- 使用
tape.gradient(ys, xs)自動計算梯度; - m使用
optimizer.apply_gradients(grads_and_vars)自動更新模型引數, - 使用
tf.keras.optimizers.SGD(learning_rate=)進行指定優化器
# 1、定義Tensor型別
X = tf.constant(X)
y = tf.constant(y)
# 2、引數使用變數初始化
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a, b]
num_epoch = 10000
optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)
for e in range(num_epoch):
# 使用tf.GradientTape()記錄損失函式的梯度資訊
with tf.GradientTape() as tape:
y_pred = a * X + b
loss = 0.5 * tf.reduce_sum(tf.square(y_pred - y))
# TensorFlow自動計算損失函式關于自變數(模型引數)的梯度
grads = tape.gradient(loss, variables)
# TensorFlow自動根據梯度更新引數
optimizer.apply_gradients(grads_and_vars=zip(grads, variables))
print(a, b)
tf.keras.optimizers.SGD(learning_rate=1e-3)宣告了一個梯度下降 優化器 (Optimizer),其學習率為 1e-3,優化器可以幫助我們根據計算出的求導結果更新模型引數,從而最小化某個特定的損失函式,具體使用方式是呼叫其apply_gradients()方法,- 更新模型引數的方法
optimizer.apply_gradients()需要提供引數grads_and_vars,具體而言,這里需要傳入一個 Python 串列(List),串列中的每個元素是一個 (變數的偏導數,變數) 對,比如這里是 [(grad_a, a), (grad_b, b)],
在實際應用中,我們撰寫的模型往往比這里一行就能寫完的線性模型 y = a * x + b 要復雜得多,所以,我們往往會撰寫并實體化一個模型類model = Model(),然后使用 y_pred = model(X) 呼叫模型,使用 model.variables 獲取模型引數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330451.html
標籤:其他
