arrow_back

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

登录 加入
访问 700 多个实验和课程

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

实验 1 小时 universal_currency_alt 5 积分 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
访问 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 介面會在新瀏覽器分頁開啟。

注意:如果在 JupyterLab 沒有看見筆記本,請按照以下額外步驟重設執行個體:

1. 關閉 JupyterLab 的瀏覽器分頁,回到 Workbench 首頁。

2. 勾選執行個體名稱旁的核取方塊,然後點按「重設」

3. 「開啟 JupyterLab」按鈕再次啟用後,等待一分鐘,然後點按「開啟 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 Keras model using .keras format model.save('saved_model.keras') # Load the model using custom_objects to handle the custom activation function new_model = tf.keras.models.load_model('saved_model.keras', custom_objects={'softmax_v2': tf.keras.activations.softmax}) # 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', custom_objects={'softmax_v2': tf.keras.activations.softmax}) # 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 2025 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

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

太好了!

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

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。