TensorFlow2 初級教程(1):快速入門

大家好!我是【AI 菌】,一枚愛彈吉他的程序員。我熱愛AI、熱愛分享、熱愛開源! 這博客是我對學習的一點總結與思考。如果您也對 深度學習、機器視覺、數據結構與算法、編程 等感興趣,可以關注我的動態,我們一起學習,一起進步~
我的博客地址爲:【AI 菌】的博客
我的Github項目地址是:【AI 菌】的Github

在這裏插入圖片描述

前言:
在上一個專欄【TF2.0深度學習實戰——圖像分類】中,我分享了各種經典的深度神經網絡的搭建和訓練過程,比如有:LeNet-5、AlexNet、VGG系列、GoogLeNet、ResNet、DenseNet等。收到了粉絲們的很多好評,表示代碼非常詳細,理論部分也講解到位。在這裏先感謝你們的持續關注和支持~
但是也有些初學者表示,直接上手深度學習有些困難,希望出一期 TensorFlow2 的初學者教程。所以,這個專欄我將專門分享TensorFlow2的學習過程,力爭打造一個的輕鬆的TensorFlow2入門學習教程,想學習的小夥伴可以關注我的動態!


一、認識 TensorFlow

(1)TensorFlow 簡介

TensorFlow 是 Google 於 2015 年發佈的深度學習框架,最初版本只支持符號式編程。得益於發佈時間較早,以及 Google 在深度學習領域的影響力,TensorFlow 很快成爲最流行的深度學習框架。目前來看,TensorFlow 和 PyTorch 框架是業界使用最爲廣泛的兩個深度學習框架,TensorFlow 在工業界擁有完備的解決方案和用戶基礎, PyTorch 得益於其精簡靈活的接口設計,可以快速設計調試網絡模型,在學術界獲得好評。

(2)TensorFlow2 新亮相

由於 TensorFlow1 接口設計頻繁變動,功能設計重複冗餘,符號式編程開發和調試非常困難等問題,TensorFlow 1.x 版本一度被業界詬病。2019年,Google 推出 TensorFlow 2 正式版本,將以動態圖優先模式運行,從而能夠避免TensorFlow 1.x 版本的諸多缺陷,已獲得業界的廣泛認可
TensorFlow 2 是一個與 TensorFlow 1.x 使用體驗完全不同的框架,TensorFlow 2 不兼容 TensorFlow 1.x 的代碼,同時在編程風格、函數接口設計等上也大相徑庭,TensorFlow 1.x 的代碼需要依賴人工的方式遷移,自動化遷移方式並不靠譜。並且Google 即將停止支持 TensorFlow 1.x,所以不建議學習 TensorFlow 1.x 版本。

(3)TensorFlow 2 與 Keras 的區別

TensorFlow 2 與 Keras 之間既有聯繫又有區別。Keras 可以理解爲一套高層 API 的設計規範,Keras 本身對這套規範有官方的實現,在 TensorFlow2 中也實現了這套規範,稱爲 tf.keras 模塊,並且 tf.keras 將作爲 TensorFlow 2 版本的唯一高層接口,避免出現接口重複冗餘的問題。

二、環境配置與搭建

首先在這裏,我先說一下自己的安裝環境:

  • Windows 10
  • Anaconda 3
  • PyCharm 2019
  • TensorFlow 2.0或者 2.1

詳細的安裝教程可參見我之前的記錄:Anaconda3+tensorflow2.0.0+PyCharm安裝與環境搭建

三、面對初學者的快速入門

爲了大家更快的入門,下面我將展示一個簡單的入門案例——用TensorFlow2實現手寫數字識別。對於初學者,我建議使用tf.keras的高層API接口進行實現,這樣代碼會更簡潔,更容易上手。具體步驟如下:

(1)導入庫

import tensorflow as tf  # 導入TF庫
from tensorflow.keras import datasets, Sequential, layers  # 導入TF子庫

(2)數據集準備

(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()   # 加載數據集,返回的是兩個元組,分別表示訓練集和測試集
x_train, x_test = x_train / 255.0, x_test / 255.0  # 歸一化,將像素值縮放到0~1

(3)模型搭建

network = Sequential([
    layers.Flatten(input_shape=(28, 28)),
    layers.Dense(128, activation='relu'),
    layers.Dropout(0.2),
    layers.Dense(10, activation='softmax')
])

(4)模型裝配與訓練,並驗證模型

# 模型裝配
network.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 模型訓練
network.fit(x_train, y_train, epochs=5)
# 驗證模型
network.evaluate(x_test, y_test, verbose=2)

訓練過程以及測試結果:

在這裏插入圖片描述
結果分析:
對mnist數據集訓練完5個epos後,模型在驗證集上的分類準確度達到97.68%。

四、面對進階者的快速入門

對於已有一定TensorFlow基礎的同學,我建議使用相對底層的方式去實現。這樣代碼雖然顯得冗長,但是操作會更靈活,更有助於我們進行更深入的學習。具體步驟如下:

(1)導入庫

import tensorflow as tf  # 導入TF庫
from tensorflow.keras import datasets, layers, Model, losses, optimizers, metrics # 導入TF子庫

(2)數據集準備

# 加載數據集,返回的是兩個元組,分別表示訓練集和測試集
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()  
# 歸一化,將像素值縮放到0~1
x_train = tf.convert_to_tensor(x_train, dtype=tf.float32)/255.  
x_test = tf.convert_to_tensor(x_test, dtype=tf.float32)/255.
# 使用 tf.data 來將數據集切分爲 batch個一組,並對數據集進行打亂
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

(3)使用類構建網絡模型

class Network(Model):
    def __init__(self):
        super(Network, self).__init__()
        self.conv1 = layers.Conv2D(32, 3, activation='relu')
        self.flatten = layers.Flatten()
        self.fc1 = layers.Dense(128, activation='relu')
        self.fc2 = layers.Dense(10, activation='softmax')

    def call(self, x):
        x = tf.reshape(x, (-1, 28, 28, 1))
        x = self.conv1(x)
        x = self.flatten(x)
        x = self.fc1(x)
        y = self.fc2(x)
        return y
network = Network()  # 實例化

(4)模型的裝配

這個部分主要涉及損失函數、優化器、評價標準的選擇和構建

# 確定目標損失函數、優化器、評價標準
loss_object = losses.SparseCategoricalCrossentropy()
optimizer = optimizers.Adam()
# 訓練集上的損失值、精確度
train_loss = metrics.Mean(name='train_loss')
train_accuracy = metrics.SparseCategoricalAccuracy(name='train_accuracy')
# 測試集上的損失值、精確度
test_loss = metrics.Mean(name='test_loss')
test_accuracy = metrics.SparseCategoricalAccuracy(name='test_accuracy')

(5)訓練與測試函數的構建

# 訓練
def train_step(images, labels):
    with tf.GradientTape() as tape:  # 建立梯度環境
        predictions = network(images)  # 前向計算
        loss = loss_object(labels, predictions)  # 計算損失
    gradients = tape.gradient(loss, network.trainable_variables)  # 計算網絡中各個參數的梯度
    optimizer.apply_gradients(zip(gradients, network.trainable_variables))  # 更新網絡參數
    train_loss(loss)  # 計算訓練損失
    train_accuracy(labels, predictions)  # 計算訓練精確度

# 測試
def test_step(images, labels):
    predictions = network(images)  # 前向計算
    t_loss = loss_object(labels, predictions)  # 計算當前輪上的損失
    test_loss(t_loss)  # 計算測試集上的損失
    test_accuracy(labels, predictions)  # 計算測試集上的準確率

(6)迭代訓練並驗證模型

for epoch in range(EPOCHS):
    # 在下一個epoch開始時,重置評估指標:所有損失值、精確度清零
    train_loss.reset_states()
    train_accuracy.reset_states()
    test_loss.reset_states()
    test_accuracy.reset_states()
    # 訓練
    for images, labels in train_ds:
        train_step(images, labels)
    # 測試
    for test_images, test_labels in test_ds:
        test_step(test_images, test_labels)
        print('Accuracy:{}'.format(test_accuracy.result()))
    # 打印訓練結果
    template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
    print(template.format(epoch+1,
                          train_loss.result(), train_accuracy.result(),
                          test_loss.result(), test_accuracy.result()))

訓練過程以及測試結果:

在這裏插入圖片描述
結果分析:
對mnist訓練集玩5個epos後,模型在訓練集上的分類準確度達到99.69%,測試集上的分類準確度達到98.43%。


完整代碼已經上傳github倉庫:https://github.com/Keyird/TensorFlow2-for-beginner
如果對你有幫助的話,歡迎star收藏~

最好的關係是互相成就,各位的「三連」就是【AI 菌】創作的最大動力,我們下期見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章