arrow_back

簡介:使用 TensorFlow 建立並訓練電腦視覺模型

登录 加入
欢迎加入我们的社区,一起测试和分享您的知识!
done
学习 700 多个动手实验和课程并获得相关技能徽章

簡介:使用 TensorFlow 建立並訓練電腦視覺模型

实验 1 小时 universal_currency_alt 5 积分 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
欢迎加入我们的社区,一起测试和分享您的知识!
done
学习 700 多个动手实验和课程并获得相关技能徽章

GSP631

Google Cloud 自修研究室標誌

總覽

TensorFlow 是開放原始碼的可攜式機器學習程式庫,由 Google 開發而成且功能強大,適用於龐大資料集。在本實驗室中,您將使用 TensorFlow Vertex AI Workbench,建立並訓練電腦視覺模型,用於辨識不同的服飾商品。

TensorFlow 簡介

TensorFlow 提供機器學習模型建構作業適用的運算架構,並具備多種工具包,可讓您在偏好的抽象層級打造模型。在本實驗室中,您將透過 TensorFlow 使用高階 API「tf.keras」,建構及訓練可分類圖像的類神經網路。

類神經網路

類神經網路模型的設計靈感源自人類大腦,由許多分層組成 (至少有一個隱藏層),其中含有簡單的連結單元或非線性關係的神經元。

類神經網路的單一節點通常會接收多個輸入值,然後輸出一個值。神經元會將活化函數 (非線性轉換) 套用至輸入值的加權總合,藉此計算輸出值。

如要進一步瞭解類神經網路,請參閱類神經網路:架構

目標

本實驗室的學習內容包括:

  • 設計、編譯、訓練及評估 TensorFlow 模型
  • 儲存及載入模型
  • 編寫回呼,自訂訓練期間的行為
  • 完成一系列的引導式練習,實驗不同分層的類神經網路

設定和需求

點選「Start Lab」按鈕前的須知事項

請詳閱以下操作說明。研究室活動會計時,而且中途無法暫停。點選「Start Lab」 後就會開始計時,讓您瞭解有多少時間可以使用 Google Cloud 資源。

您將在真正的雲端環境中完成實作研究室活動,而不是在模擬或示範環境。為達此目的,我們會提供新的暫時憑證,讓您用來在研究室活動期間登入及存取 Google Cloud。

如要完成這個研究室活動,請先確認:

  • 您可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意:請使用無痕模式或私密瀏覽視窗執行此研究室。這可以防止個人帳戶和學生帳戶之間的衝突,避免個人帳戶產生額外費用。
  • 是時候完成研究室活動了!別忘了,活動一開始將無法暫停。
注意:如果您擁有個人 Google Cloud 帳戶或專案,請勿用於本研究室,以免產生額外費用。

工作 1:開啟 Vertex AI Workbench 中的筆記本

  1. 前往 Google Cloud 控制台,依序點選「導覽選單」>「Vertex AI」>「Workbench」

  2. 找出 執行個體,點選「Open JupyterLab」按鈕。

Workbench 執行個體的 JupyterLab 介面會在新瀏覽器分頁中開啟。

安裝 TensorFlow 和其他套件

  1. 在啟動器選單的「Other」底下,選取「Terminal」

  2. 檢查 Python 環境是否已設定完成,接著複製下列指令並貼到終端機。

python --version

輸出內容範例:

Python 3.10.14
  1. 執行下列指令,安裝 TensorFlow 套件。
pip3 install tensorflow
  1. 在終端機執行下列指令,更新 pip3
pip3 install --upgrade pip

Pylint 是檢查 Python 程式碼錯誤的工具,可以標示出 Python 原始碼中的語法和樣式問題。

  1. 執行下列指令,安裝 pylint 套件。
pip install -U pylint --user
  1. 使用 requirements.txt 檔案,安裝實驗室所需的套件:
pip install -r requirements.txt

現在環境已設定完畢!

工作 2:建立新筆記本及匯入程式庫

  1. 點選 Workbench 左側的「+」圖示,開啟新的啟動器。

  2. 在啟動器選單的「Notebook」底下,選取「Python3」

新的筆記本檔案

畫面會顯示新的 Jupyter 筆記本。如要進一步瞭解如何使用 Jupyter 筆記本,請參閱 Jupyter Notebook 說明文件

  1. 匯入並設定 Cloud Logging 的 logginggoogle-cloud-logging在第一個儲存格新增下列程式碼:
# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging cloud_logger = logging.getLogger('cloudLogger') cloud_logger.setLevel(logging.INFO) cloud_logger.addHandler(CloudLoggingHandler(cloud_logging.Client())) cloud_logger.addHandler(logging.StreamHandler())
  1. 為了訓練和評估模型,請匯入 tensorflow,並命名為 tf 以利使用。接著,在第一個儲存格新增下列程式碼。
# Import TensorFlow import tensorflow as tf
  1. 為了剖析資料並進行偵錯,請匯入 numpy,並命名為 np 以利使用。接著,在第一個儲存格新增下列程式碼。
# Import numpy import numpy as np
  1. 為了整合資料集,請在第一個儲存格新增下列程式碼,匯入 tensorflow_datasetsTensorFlow Datasets 是立即可用的一系列資料集,適用於 TensorFlow
如要進一步瞭解使用方式,請參閱指南資料集清單 # Import tensorflow_datasets import tensorflow_datasets as tfds
  1. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行儲存格。

  2. 如要儲存筆記本,請依序點選「File」>「Save」。接著,將檔案命名為 model.ipynb 並點選「OK」

工作 3:載入並預先處理資料集

資料集簡介

您將運用 Fashion MNIST 資料集,訓練出能分類服飾圖像的類神經網路。

這個資料集含有 10 種類別的服飾,共 7 萬件商品。下列圖像以低解析度 (28 x 28 像素) 顯示個別服飾:

2c4b51c68ec17b3b.png

在本實驗室中,有 6 萬張圖像會用於訓練類神經網路,有 1 萬張圖像則會用於評估此網路正確分類圖像的成效。

Fashion MNIST 資料可從 Tensorflow Datasets (tfds) 中取得。

載入資料集

為了載入 Fashion MNIST 資料,您需要使用 tfds.load() 函式。

  1. 在筆記本的第二個儲存格新增下列程式碼:
# Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True)

在上方程式碼中,您透過 split 引數指定要載入哪些資料集分割。您將 as_supervised 設為 True,確保載入的 tf.data.Dataset 採用 2 元組結構 (input, label)

tf.data.Dataset 分屬 2 種類型:ds_trainds_testds_train 有 6 萬張圖像會用於訓練模型,ds_test 則有 1 萬張圖像會用於評估模型。

如要進一步瞭解 tfds.load() 和其引數,請參閱指南

怎麼設定值呢?

  1. 接下來新增 print 陳述式,查看商品 0 訓練圖像的最大值和最小值。在第二個儲存格新增下列程式碼:
# Values before normalization image_batch, labels_batch = next(iter(ds_train)) print("Before normalization ->", np.min(image_batch[0]), np.max(image_batch[0]))

資料預先處理

  1. 機器學習領域有個詞彙叫批量,是指單次疊代使用的訓練樣本數量。這裡您會將這個參數的值設為 32

將下列程式碼新增至 model.ipynb,即可指定批量

# Define batch size BATCH_SIZE = 32
  1. 基於各種原因,訓練類神經網路時,將像素值調整為 0 到 1 之間會使作業變得較為簡單,這項程序稱為「正規化」。FashionMNIST 資料集的像素值落在 [0, 255] 這個範圍,因此您會將像素值除以 255.0 來將圖像正規化。

下列程式碼使用 tf.data.Datasetmap() 函式,將 ds_trainds_test 的圖像正規化。由於像素值的類型為 tf.uint8,需使用 tf.cast 函式將值轉為 tf.float32,並除以 255.0。呼叫 batch() 方法並搭配引數 BATCH_SIZE,資料集也將轉為數個批次。

如要進一步瞭解 tf.data.Dataset 可用的所有方法,請按這裡

在檔案結尾新增下列程式碼:

# Normalize and batch process the dataset ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE)
  1. 再次使用 print 陳述式,查看訓練資料集中圖像的最大值和最小值:

在檔案結尾新增下列程式碼:

# Examine the min and max values of the batch after normalization image_batch, labels_batch = next(iter(ds_train)) print("After normalization ->", np.min(image_batch[0]), np.max(image_batch[0]))

工作 4:設計、編譯及訓練模型

在本節中,您將使用 TensorFlow 設計自己的模型。

  1. 在檔案新增下列程式碼:
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])

查看模型架構中使用的不同分層類型和參數:

  • Sequential:定義類神經網路中的分層序列。

  • Flatten:圖像形狀為 (28, 28),也就是值採用正方形矩陣。Flatten 會接收該正方形矩陣並轉為一維度向量。

  • Dense:新增神經元層。

每層神經元需要搭配活化函數,藉此判定神經元是否應啟動。可用的活化函數非常多,但本實驗室採用下列兩種:

  • Relu:如果實際上 X > 0 就傳回 X,否則傳回 0。大於或等於 0 的值會傳至類神經網路的下一層。
  • Softmax:接收一組值並選取最大值,讓您不必排序就能找出最大值。舉例來說,如果最後一層的輸出結果為 [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05],系統會傳回 [0,0,0,0,1,0,0,0,0]。

編譯及訓練模型

在本節中,首先您會透過最佳化器和損失函式來編譯模型,然後利用訓練資料和標籤訓練模型。

我們的目標是讓模型可理解訓練資料和標籤的關係。訓練完成後,模型看到與訓練資料類似的服飾圖像時,應能預測這些服飾屬於哪種類別。

最佳化器是編譯 tf.keras 模型所需的兩個引數之一。Optimizer 這種演算法會修改類神經網路的屬性,像是權重和學習率,這有助於降低損失並提高準確率。

如要進一步瞭解 tf.keras 中不同類型的最佳化器,請按這裡

Loss 會以數字呈現模型的成效。如果模型成效優異,損失的數字會較小;如果模型成效不佳,損失的數字會較大。

如要進一步瞭解 tf.keras 中不同類型的損失函式,請按這裡

請留意 metrics= 參數,該參數會比對預測結果和已知答案 (標籤),讓 TensorFlow 回報每個訓練週期結束後的準確率。簡單來說,系統會回報訓練進度的成效。

如要進一步瞭解 tf.keras 中不同類型的指標,請按這裡

Model.fit 會以固定的訓練週期數訓練模型。

  1. 在檔案新增下列程式碼:
# Compile the model model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5)

點選「Check my progress」,確認目標已達成。建立機器學習模型

執行程式碼

  1. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行第二個儲存格。

執行筆記本儲存格時,您會看到每個訓練週期 (或傳遞) 結束時的損失和準確率。隨著每個訓練週期 (或傳遞) 結束,準確率會逐步提高:

輸出範例 (您的值可能會略有不同,請忽略任何警告訊息):

Before normalization -> 0 227 After normalization -> 0.0 1.0 Epoch 1/5 1875/1875 [==============================] - 12s 6ms/step - loss: 0.5264 - sparse_categorical_accuracy: 0.8175 Epoch 2/5 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3977 - sparse_categorical_accuracy: 0.8580 Epoch 3/5 1875/1875 [==============================] - 5s 3ms/step - loss: 0.3585 - sparse_categorical_accuracy: 0.8701 Epoch 4/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3329 - sparse_categorical_accuracy: 0.8784 Epoch 5/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3151 - sparse_categorical_accuracy: 0.8846

對於 # Values before normalization 輸出結果,您會發現最大值和最小值落在 [0, 255] 這個範圍。完成正規化後,您可以看到所有值都在 [0, 1] 這個範圍。

隨著訓練進行,損失會降低,準確率則會提高:

模型訓練完成後,您會在最後的訓練週期結尾看到一個準確率,該值應會接近上方的 0.8846 (您的準確率可能會略有不同)。

這代表類神經網路分類訓練資料的準確率約為 89%。換句話說,該網路找出圖像和標籤之間的模式,且成功比對的機率達 89%。考量到類神經網路規模較小,且只經過五個訓練週期,結果雖然不算很棒,但也不差。

工作 5:評估模型在全新資料的表現

如果是不曾看過的資料,模型的成效又會如何呢?

測試集有助於解答這個問題。請呼叫 model.evaluate、傳入兩個測試集,然後回報個別的損失。

評估測試集:

  1. 在筆記本的第三個儲存格新增下列程式碼:
cloud_logger.info(model.evaluate(ds_test))
  1. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行儲存格。

如果您捲動至輸出內容的底部,可以在最後一行看到評估結果。

Before normalization -> 0 227 After normalization -> 0.0 1.0 Epoch 1/5 1875/1875 [==============================] - 12s 6ms/step - loss: 0.5264 - sparse_categorical_accuracy: 0.8175 Epoch 2/5 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3977 - sparse_categorical_accuracy: 0.8580 Epoch 3/5 1875/1875 [==============================] - 5s 3ms/step - loss: 0.3585 - sparse_categorical_accuracy: 0.8701 Epoch 4/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3329 - sparse_categorical_accuracy: 0.8784 Epoch 5/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3151 - sparse_categorical_accuracy: 0.8846 313/313 [==============================] - 1s 4ms/step - loss: 0.3653 - sparse_categorical_accuracy: 0.8708 INFO:cloudLogger:[0.36530008912086487, 0.8708000183105469]

模型在測試集 ds_test 的準確率為 .8708,代表分類正確的機率為 87% (您的值可能會略有不同)。

如同預期,模型分類未知資料的準確率低於分類訓練資料。

隨著進一步瞭解 TensorFlow,您會掌握如何提高準確率。

點選「Check my progress」,確認目標已達成。使用模型

工作 6:儲存及載入模型

您可以在模型訓練期間或完成後儲存進度,這代表模型能從上次中斷的地方繼續訓練,避免訓練時間過長。儲存模型後,您也能分享給他人,交由他們自行發揮。在第一個練習中,您將新增所需的程式碼,來儲存及載入模型。

整個模型可儲存成兩種檔案格式:SavedModelKerasTensorFlow SavedModel 是 TF2.x 的預設檔案格式。不過,您也能以 Keras 格式儲存模型。您將進一步瞭解以這兩種檔案格式儲存模型的相關事宜。
  1. 在筆記本的第四個儲存格新增下列程式碼:
# Save the entire model as a SavedModel. model.save('saved_model') # Reload a fresh Keras model from the saved model new_model = tf.keras.models.load_model('saved_model') # Summary of loaded SavedModel new_model.summary() # Save the entire model to a keras file. model.save('my_model.keras') # Recreate the exact same model, including its weights and the optimizer new_model_keras = tf.keras.models.load_model('my_model.keras') # Summary of loaded keras model new_model_keras.summary()

上方程式碼顯示如何將模型儲存成兩種不同格式,以及如何重新載入儲存的模型。您可以視需求選用適合的格式。歡迎參閱 TensorFlow 的「儲存及載入模型」說明文件,進一步瞭解這項功能。

  1. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行儲存格。

在輸出內容的結尾,您會看到兩組模型摘要。第一組是指以 SavedModel 格式儲存的模型,第二組則是指以 h5 格式儲存的模型。

您可以看到兩組模型摘要一模一樣,這是因為我們只是以兩種格式儲存同一個模型。

Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 dense (Dense) (None, 64) 50240 dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 50,890 Trainable params: 50,890 Non-trainable params: 0 _________________________________________________________________ Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 dense (Dense) (None, 64) 50240 dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 50,890 Trainable params: 50,890 Non-trainable params: 0 _________________________________________________________________

點選「Check my progress」,確認目標已達成。儲存及載入模型

工作 7:探索回呼

先前您已發現隨著訓練進行,模型的損失會降低,而準確率會提高。在達到期望的準確率和損失後,您可能還需要稍候片刻,等待訓練完成。

您可能曾想過:「如果可以在模型達到所需的準確率時就停止訓練,豈不是更棒?」

例如您希望準確率為 95%,而模型預計在 3 個訓練週期後即可達成目標,那為何要等待模型完成更多次的訓練週期呢?

想要及時停止訓練,最佳做法就是使用回呼函式

回呼是一項強大工具,可自訂 Keras 模型在訓練、評估或推論期間的行為。您可以定義回呼,要求模型在使用訓練集達到所需準確率時,就停止訓練。

試用下列程式碼,瞭解如何透過回呼在準確率達 84% 時停止訓練:

  1. 開啟啟動器並選取「Python3」,即可建立新的 Jupiter 筆記本。

  2. 將檔案儲存為 callback_model.ipynb

  3. 將下列程式碼貼入 callback_model.ipynb 的第一個儲存格:

# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging exp_logger = logging.getLogger('expLogger') exp_logger.setLevel(logging.INFO) exp_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="callback")) # Import tensorflow_datasets import tensorflow_datasets as tfds # Import numpy import numpy as np # Import TensorFlow import tensorflow as tf # Define Callback class myCallback(tf.keras.callbacks.Callback): def on_epoch_end(self, epoch, logs={}): if(logs.get('sparse_categorical_accuracy')>0.84): exp_logger.info("\nReached 84% accuracy so cancelling training!") self.model.stop_training = True callbacks = myCallback() # Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # Compile data model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5, callbacks=[callbacks])
  1. 如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。

  2. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行程式碼。

您可以看到經過幾個訓練週期後,訓練作業就取消了。

點選「Check my progress」,確認目標已達成。探索回呼

工作 8:測試模型

在本節中,您將測試類神經網路的不同分層。

練習 1

在本練習中,您會探索模型中的分層。如果您變更神經元數量,會發生什麼事?

  1. 開啟啟動器並選取「Python3」,即可建立新的 Jupiter 筆記本。

  2. 將檔案儲存為 updated_model.ipynb

  3. 將下列程式碼貼入 updated_model.ipynb 的第一個儲存格:

# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging up_logger = logging.getLogger('upLogger') up_logger.setLevel(logging.INFO) up_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="updated")) # Import tensorflow_datasets import tensorflow_datasets as tfds # Import numpy import numpy as np # Import TensorFlow import tensorflow as tf # Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # Compile data model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5) # Logs model summary model.summary(print_fn=up_logger.info)
  1. 在稠密層測試不同的值。

前往 # Define the model 區段,將神經元數量從 64 改為 128:

# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。

  2. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行程式碼。

損失和訓練時間等指標的結果會有什麼不同?為何會變成這樣?

當您將神經元數量增加到 128 時,計算作業的數量也會隨之增加,進而減慢訓練速度。在本例中,增加數量有正面影響,因為模型變得更準確,然而不一定「多就是好」,您可能很快就碰到效益遞減的情況。

點選「Check my progress」,確認目標已達成。練習 1

練習 2

想想在類神經網路中加入額外分層的效果。如果您在兩個稠密層之間再加入一層,會有什麼影響?

  1. 找到 updated_model.ipynb 檔案,在 # Define the model 區段中新增一層。

將模型定義換成下列內容:

# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。

  2. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行程式碼。

答案是沒有明顯影響,因為這些資料相對較為簡單。如果是更複雜的資料,通常需要額外加入分層。

點選「Check my progress」,確認目標已達成。練習 2

練習 3

在開始訓練模型前,您透過正規化使像素值範圍落在 [0, 1]。如果不要正規化,讓像素值範圍與原先在資料集時相同 ([0, 255]),會有什麼影響呢?

  1. 讓我們來試試看!在 # Define, load and configure data 區段中,將訓練和測試資料集的 map 函式移除。
# Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.batch(BATCH_SIZE) ds_test = ds_test.batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 在儲存格結尾加入這段程式碼,呈現批次 0 中第一張圖像的最大值。在沒有正規化時,最大值會落在 [0, 255] 這個範圍。
# Print out max value to see the changes image_batch, labels_batch = next(iter(ds_train)) t_image_batch, t_labels_batch = next(iter(ds_test)) up_logger.info("training images max " + str(np.max(image_batch[0]))) up_logger.info("test images max " + str(np.max(t_image_batch[0])))
  1. updated_model.ipynb 最終應如下所示:
# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging up_logger = logging.getLogger('upLogger') up_logger.setLevel(logging.INFO) up_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="updated")) # Import tensorflow_datasets import tensorflow_datasets as tfds # Import numpy import numpy as np # Import TensorFlow import tensorflow as tf # Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.batch(BATCH_SIZE) ds_test = ds_test.batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # Compile data model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5) # Logs model summary model.summary(print_fn=up_logger.info) # Print out max value to see the changes image_batch, labels_batch = next(iter(ds_train)) t_image_batch, t_labels_batch = next(iter(ds_test)) up_logger.info("training images max " + str(np.max(image_batch[0]))) up_logger.info("test images max " + str(np.max(t_image_batch[0])))
  1. 如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。

  2. 點選「Run」按鈕或按下 Shift + Enter 鍵,執行程式碼。

# Print out max value to see the changes 的輸出結果應如下所示:

INFO:upLogger:training images max 255 INFO:upLogger:test images max 255

訓練週期結束後,您可以看到沒有正規化時的準確率差異。

您覺得造成準確率變動的原因是什麼?

這篇 Stack Overflow 文章提供了很棒的解答。

點選「Check my progress」,確認目標已達成。練習 3

練習 4

如果移除 Flatten() 層會有什麼影響?原因為何?

我們一起試試看:

  1. # Define the model 區段中,移除 tf.keras.layers.Flatten()
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 儲存並執行 updated_model.ipynb 的儲存格。

您會收到資料形狀的錯誤訊息,而這並非意外情況。

目前錯誤詳細資料可能無法提供確切資訊,但驗證了一項經驗法則:類神經網路的第一層應與資料形狀相同。輸入圖像的形狀為 28x28,但打造每層 28 個神經元共 28 層的架構並不可行,因此將 28x28 扁平化為 784x1 更為合理。

您可以一開始就新增 Flatten() 層,不必自己編寫所有程式碼來處理這項作業。稍後將陣列載入模型時,系統會自動進行扁平化。

練習 5

請留意最後一層 (輸出層),為什麼有 10 個神經元?如果數量不是 10,又會有什麼影響呢?

將數字調整為 5 並訓練類神經網路,一起看看結果。

  1. # Define the model 區段換成下列內容,復原您在前一節做出的更動:
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 將最後一層的神經元數量從 10 改為 5:
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(5, activation=tf.nn.softmax)])
  1. 儲存並執行 updated_model.ipynb 的儲存格。

結果:當值與預期不符時,您就會收到錯誤訊息。

這驗證另一個經驗法則:最後一層的神經元數量應與要分類的類別數量相同。在本例中,數字為 0 到 9 (共 10 項),因此最後一層應該有 10 個神經元。

恭喜!

恭喜!在本實驗室中,您已瞭解如何設計、編譯、訓練和評估 Tensorflow 模型。您也學到如何儲存和載入模型,以及撰寫回呼函式來自訂訓練期間的行為。最後完成一系列的引導式練習,測試了類神經網路的不同分層。

後續步驟/瞭解詳情

Google Cloud 教育訓練與認證

協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。

使用手冊上次更新日期:2024 年 9 月 12 日

實驗室上次測試日期:2024 年 9 月 12 日

Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您