目錄
TensorFlow 2.x基礎
1、安裝 TensorFlow 2.x
2、TensorFlow 2.x 基礎概念
2、1 Eager Execution
2、2 TensorFlow 張量(Tensor)
3、使用Keras構建神經網絡模型
3、1 構建 Sequential 模型
3、2 編譯模型
1、Optimizer(優化器)
2、Loss(損失函數)
3、Metrics(評估指標)
3、3 訓練模型
3、4 評估模型
3、5 預測
4、使用 TensorFlow 2.x 實現自定義訓練循環
5、TensorFlow 2.x 高級功能
5、1 TensorFlow Dataset(數據管道)
5、2 TensorFlow Serving
5、3 TensorFlow Lite(模型優化和部署)
總結
TensorFlow 2.x基礎
TensorFlow 2.x 是一個廣泛使用的深度學習框架,特別適用于神經網絡的構建和訓練。與之前的版本相比,TensorFlow 2.x 提供了更加簡潔和易用的 API,集成了 Keras 作為高層 API,并支持動態圖(Eager Execution)。
1、安裝 TensorFlow 2.x
首先,確保你已經安裝了 TensorFlow 2.x。(Python 3.11.4)可以通過以下命令來安裝:pip install tensorflow 查看:pip show tensorflow
Name: tensorflow
Version: 2.18.0
2、TensorFlow 2.x 基礎概念
2、1 Eager Execution
TensorFlow 2.x 默認啟用 Eager Execution,這意味著操作是即時執行的,計算結果會立刻返回,而不需要構建圖。這樣使得調試更加容易,代碼更具可讀性。
import tensorflow as tf# 啟用 Eager Execution
tf.compat.v1.enable_eager_execution()# 創建一個張量并執行操作
a = tf.constant([1, 2, 3])
b = tf.constant([4, 5, 6])c = a + b # 即時執行
print(c) # 輸出結果: tf.Tensor([5 7 9], shape=(3,), dtype=int32)
2、2 TensorFlow 張量(Tensor)
TensorFlow 的核心數據結構是張量(tensor)。張量類似于 NumPy 數組,可以存儲數據并在 TensorFlow 圖中傳遞。你可以創建不同類型的張量:
# 創建張量
t1 = tf.constant([1, 2, 3]) # 一維張量
t2 = tf.constant([[1, 2], [3, 4]]) # 二維張量
# 張量操作
t3 = t1 + 5 # 所有元素加5
print(t3) # tf.Tensor([6 7 8], shape=(3,), dtype=int32)
3、使用Keras構建神經網絡模型
TensorFlow 2.x 中,Keras 成為默認的高級API。通過Keras可以快速構建和訓練神經網絡。
3、1 構建 Sequential 模型
tf.keras.models.Sequential 是TensorFlow Keras API 中用于構建模型的一種簡單方式。它允許你按順序堆疊多個層(layers),以構建深度學習模型,可以通過 add 方法向模型中添加層。常用的層包括全連接層(Dense)、卷積層(Conv2D)、池化層(MaxPooling2D)等
from tensorflow.keras import layers, models
# 創建一個簡單的 Sequential 模型
model = models.Sequential([#有 128 個神經元,激活函數為 ReLUlayers.Dense(128, activation='relu', input_shape=(784,)), # 輸入層784 維的向量layers.Dropout(0.2), # Dropout 層丟棄 20% 的神經元,防止過擬合layers.Dense(10, activation='softmax') # 輸出層10 個神經元,激活函數為 softmax用于多分類
])# 打印模型概述
model.summary()
3、2 編譯模型
在構建模型后,需要編譯它,選擇優化器、損失函數和評估指標:在深度學習中,optimizer、loss 和 metrics 是模型編譯時的重要參數。下面將詳細解釋這三個參數的含義及其在模型訓練中的作用。
1、Optimizer(優化器)
optimizer='adam' 指定了使用 Adam 優化器。優化器的主要作用是更新模型的權重,以最小化損失函數。Adam 優化器結合了動量和自適應學習率的優點,通常在許多任務中表現良好。
Adam 優化器的特點:自適應學習率:根據每個參數的歷史梯度動態調整學習率。適合大規模數據和高維參數。通常收斂速度快,效果好。
2、Loss(損失函數)
loss='sparse_categorical_crossentropy' 指定了使用稀疏分類交叉熵作為損失函數。損失函數用于衡量模型預測值與真實值之間的差距。
稀疏分類交叉熵的特點:適用于多分類問題,且標簽是整數形式(而不是獨熱編碼)。計算方式是對每個樣本的預測概率與真實標簽的交叉熵進行求和。適合處理類別較多的分類問題。
3、Metrics(評估指標)
metrics=['accuracy'] 指定了在訓練和評估過程中使用的評估指標。在這里,使用的是準確率(accuracy它表示模型預測正確的樣本占總樣本的比例。
準確率的特點:簡單易懂,常用于分類問題。適合類別均衡的數據集,但在類別不均衡時可能會產生誤導。
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
3、3 訓練模型
訓練模型時,需要指定訓練數據、標簽、批量大小、訓練的輪數(epochs)等參數:
# 假設我們已經加載了 MNIST 數據集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()# 預處理數據
train_images = train_images.reshape((train_images.shape[0], 784)).astype('float32') / 255
test_images = test_images.reshape((test_images.shape[0], 784)).astype('float32') / 255# 訓練模型
history = model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))
-
epochs:表示整個訓練數據集將被訓練的次數。設置為5模型將遍歷整個訓練數據集5次
-
batch_size:表示每次迭代中用于訓練的樣本數量。選擇合適的 batch_size對模型的訓練速度和性能有很大影響。常見的選擇有32、64、128等,具體選擇可以根據你的數據集大小和計算資源來決定。
3、4 評估模型
訓練完成后,可以通過 evaluate 函數來評估模型在測試集上的表現:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')
model.evaluate(test_images, test_labels):這個函數用于評估模型在測試數據集上的表現。
test_images 是測試集的輸入數據,通常是圖像數據。
test_labels 是對應的標簽,表示每個測試樣本的真實類別。
該函數返回兩個值:test_loss 和 test_acc,分別表示測試集上的損失值和準確率。print(f'Test accuracy: {test_acc}'):
準確率 (Accuracy):正確預測的樣本占總樣本的比例。
精確率 (Precision):正確預測為正類的樣本占所有預測為正類的樣本的比例。
召回率 (Recall):正確預測為正類的樣本占所有實際為正類的樣本的比例。
F1-score:精確率和召回率的調和平均數。
3、5 預測
使用訓練好的模型進行預測:
predictions = model.predict(test_images)
print(predictions[0]) # 打印第一個測試樣本的預測結果
4、使用 TensorFlow 2.x 實現自定義訓練循環
雖然 Keras 提供了便捷的接口,但有時我們需要更多控制,特別是需要自定義訓練循環時。在 TensorFlow 2.x 中,你可以輕松實現自定義的訓練循環。
# 自定義訓練循環
for epoch in range(5): # 訓練5輪for step, (images, labels) in enumerate(train_dataset):with tf.GradientTape() as tape:predictions = model(images, training=True)loss = tf.losses.sparse_categorical_crossentropy(labels, predictions)# 計算梯度并更新模型參數grads = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(grads, model.trainable_variables))
5、TensorFlow 2.x 高級功能
5、1 TensorFlow Dataset(數據管道)
tf.data API 用于構建高效的數據管道,尤其是在處理大規模數據時。可以創建自定義的數據集、批處理和預處理操作。
# 加載數據集并進行預處理
train_dataset = tf.data.Dataset.from_tensor_slices((train_images, train_labels))
train_dataset = train_dataset.shuffle(10000).batch(64)# 迭代數據
for images, labels in train_dataset:print(images.shape, labels.shape)
tf.data.Dataset.from_tensor_slices((train_images, train_labels)):函數將訓練圖像和標簽轉換為一個 tf.data.Dataset 對象。train_images 是一個包含訓練圖像的張量,train_labels 是對應的標簽這個方法會將每個圖像和其對應的標簽配對,形成一個數據集。
train_dataset.shuffle(10000):這個方法用于隨機打亂數據集中的樣本,以提高模型的泛化能力。參數 10000 指定了緩沖區的大小,表示在打亂時會隨機選擇最多10000個樣本進行打亂。這個值可以根據你的數據集大小進行調整。
batch(64):這個方法將數據集分成多個批次,每個批次包含64個樣本。在訓練過程中,模型會一次處理一個批次的數據,這樣可以提高訓練效率并減少內存占用。
5、2 TensorFlow Serving
TensorFlow Serving 是一個為生產環境提供的高效部署服務,它可以幫助你在服務器端進行實時的模型推理。你可以通過 TensorFlow Serving 部署訓練好的模型,并通過 API 進行訪問。
# 啟動 TensorFlow Serving
docker run -p 8501:8501 --name=tf_serving_mnist \--mount type=bind,source=/path/to/saved_model,destination=/models/mnist \-e MODEL_NAME=mnist -t tensorflow/serving
5、3 TensorFlow Lite(模型優化和部署)
TensorFlow Lite 允許將訓練好的模型轉換為適用于移動設備和邊緣設備的格式。通過量化和剪枝等技術,TensorFlow Lite 可以顯著減少模型的大小和計算需求。
# 使用 TensorFlow Lite 轉換模型
tflite_convert --saved_model_dir=/path/to/saved_model --output_file=model.tflite
總結
TensorFlow 2.x 是一個功能強大且靈活的深度學習框架,它集成了許多先進的功能,如 Keras、高效的數據處理 API(tf.data)、Eager Execution 和自動化的模型優化工具。通過簡潔的 API 和強大的性能,TensorFlow 2.x 成為深度學習開發人員的首選框架之一。