GSP631
總覽
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 中的筆記本
-
前往 Google Cloud 控制台,依序點選「導覽選單」>「Vertex AI」>「Workbench」。
-
找出 執行個體,點選「Open JupyterLab」按鈕。
Workbench 執行個體的 JupyterLab 介面會在新瀏覽器分頁中開啟。
安裝 TensorFlow 和其他套件
-
在啟動器選單的「Other」底下,選取「Terminal」。
-
檢查 Python 環境是否已設定完成,接著複製下列指令並貼到終端機。
python --version
輸出內容範例:
Python 3.10.14
- 執行下列指令,安裝 TensorFlow 套件。
pip3 install tensorflow
- 在終端機執行下列指令,更新
pip3
。
pip3 install --upgrade pip
Pylint 是檢查 Python 程式碼錯誤的工具,可以標示出 Python 原始碼中的語法和樣式問題。
- 執行下列指令,安裝
pylint
套件。
pip install -U pylint --user
- 使用
requirements.txt
檔案,安裝實驗室所需的套件:
pip install -r requirements.txt
現在環境已設定完畢!
工作 2:建立新筆記本及匯入程式庫
-
點選 Workbench 左側的「+」圖示,開啟新的啟動器。
-
在啟動器選單的「Notebook」底下,選取「Python3」。
畫面會顯示新的 Jupyter 筆記本。如要進一步瞭解如何使用 Jupyter 筆記本,請參閱 Jupyter Notebook 說明文件。
- 匯入並設定 Cloud Logging 的
logging
和 google-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())
- 為了訓練和評估模型,請匯入
tensorflow
,並命名為 tf
以利使用。接著,在第一個儲存格新增下列程式碼。
# Import TensorFlow
import tensorflow as tf
- 為了剖析資料並進行偵錯,請匯入
numpy
,並命名為 np
以利使用。接著,在第一個儲存格新增下列程式碼。
# Import numpy
import numpy as np
- 為了整合資料集,請在第一個儲存格新增下列程式碼,匯入
tensorflow_datasets
。TensorFlow Datasets 是立即可用的一系列資料集,適用於 TensorFlow。
如要進一步瞭解使用方式,請參閱指南和資料集清單。
# Import tensorflow_datasets
import tensorflow_datasets as tfds
-
點選「Run」按鈕或按下 Shift + Enter 鍵,執行儲存格。
-
如要儲存筆記本,請依序點選「File」>「Save」。接著,將檔案命名為 model.ipynb
並點選「OK」。
工作 3:載入並預先處理資料集
資料集簡介
您將運用 Fashion MNIST 資料集,訓練出能分類服飾圖像的類神經網路。
這個資料集含有 10 種類別的服飾,共 7 萬件商品。下列圖像以低解析度 (28 x 28 像素) 顯示個別服飾:
在本實驗室中,有 6 萬張圖像會用於訓練類神經網路,有 1 萬張圖像則會用於評估此網路正確分類圖像的成效。
Fashion MNIST 資料可從 Tensorflow Datasets (tfds) 中取得。
載入資料集
為了載入 Fashion MNIST 資料,您需要使用 tfds.load()
函式。
- 在筆記本的第二個儲存格新增下列程式碼:
# 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_train 和 ds_test。ds_train 有 6 萬張圖像會用於訓練模型,ds_test 則有 1 萬張圖像會用於評估模型。
如要進一步瞭解 tfds.load()
和其引數,請參閱指南。
怎麼設定值呢?
- 接下來新增 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]))
資料預先處理
- 機器學習領域有個詞彙叫批量,是指單次疊代使用的訓練樣本數量。這裡您會將這個參數的值設為
32
。
將下列程式碼新增至 model.ipynb
,即可指定批量:
# Define batch size
BATCH_SIZE = 32
- 基於各種原因,訓練類神經網路時,將像素值調整為 0 到 1 之間會使作業變得較為簡單,這項程序稱為「正規化」。FashionMNIST 資料集的像素值落在 [0, 255] 這個範圍,因此您會將像素值除以 255.0 來將圖像正規化。
下列程式碼使用 tf.data.Dataset
的 map()
函式,將 ds_train
和 ds_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)
- 再次使用 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 設計自己的模型。
- 在檔案新增下列程式碼:
# 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)])
查看模型架構中使用的不同分層類型和參數:
每層神經元需要搭配活化函數,藉此判定神經元是否應啟動。可用的活化函數非常多,但本實驗室採用下列兩種:
-
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 會以固定的訓練週期數訓練模型。
- 在檔案新增下列程式碼:
# 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」,確認目標已達成。建立機器學習模型
執行程式碼
- 點選「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
、傳入兩個測試集,然後回報個別的損失。
評估測試集:
- 在筆記本的第三個儲存格新增下列程式碼:
cloud_logger.info(model.evaluate(ds_test))
- 點選「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:儲存及載入模型
您可以在模型訓練期間或完成後儲存進度,這代表模型能從上次中斷的地方繼續訓練,避免訓練時間過長。儲存模型後,您也能分享給他人,交由他們自行發揮。在第一個練習中,您將新增所需的程式碼,來儲存及載入模型。
整個模型可儲存成兩種檔案格式:SavedModel
和 Keras
。TensorFlow SavedModel
是 TF2.x 的預設檔案格式。不過,您也能以 Keras
格式儲存模型。您將進一步瞭解以這兩種檔案格式儲存模型的相關事宜。
- 在筆記本的第四個儲存格新增下列程式碼:
# 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 的「儲存及載入模型」說明文件,進一步瞭解這項功能。
- 點選「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% 時停止訓練:
-
開啟啟動器並選取「Python3」,即可建立新的 Jupiter 筆記本。
-
將檔案儲存為 callback_model.ipynb
。
-
將下列程式碼貼入 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])
-
如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。
-
點選「Run」按鈕或按下 Shift + Enter 鍵,執行程式碼。
您可以看到經過幾個訓練週期後,訓練作業就取消了。
點選「Check my progress」,確認目標已達成。探索回呼
工作 8:測試模型
在本節中,您將測試類神經網路的不同分層。
練習 1
在本練習中,您會探索模型中的分層。如果您變更神經元數量,會發生什麼事?
-
開啟啟動器並選取「Python3」,即可建立新的 Jupiter 筆記本。
-
將檔案儲存為 updated_model.ipynb
。
-
將下列程式碼貼入 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)
- 在稠密層測試不同的值。
前往 # 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)])
-
如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。
-
點選「Run」按鈕或按下 Shift + Enter 鍵,執行程式碼。
損失和訓練時間等指標的結果會有什麼不同?為何會變成這樣?
當您將神經元數量增加到 128 時,計算作業的數量也會隨之增加,進而減慢訓練速度。在本例中,增加數量有正面影響,因為模型變得更準確,然而不一定「多就是好」,您可能很快就碰到效益遞減的情況。
點選「Check my progress」,確認目標已達成。練習 1
練習 2
想想在類神經網路中加入額外分層的效果。如果您在兩個稠密層之間再加入一層,會有什麼影響?
- 找到
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)])
-
如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。
-
點選「Run」按鈕或按下 Shift + Enter 鍵,執行程式碼。
答案是沒有明顯影響,因為這些資料相對較為簡單。如果是更複雜的資料,通常需要額外加入分層。
點選「Check my progress」,確認目標已達成。練習 2
練習 3
在開始訓練模型前,您透過正規化使像素值範圍落在 [0, 1]
。如果不要正規化,讓像素值範圍與原先在資料集時相同 ([0, 255]),會有什麼影響呢?
- 讓我們來試試看!在
# 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)])
- 在儲存格結尾加入這段程式碼,呈現批次 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])))
-
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])))
-
如要儲存變更,請按下 Ctrl + S 鍵,或是依序點選「File」>「Save Notebook」。
-
點選「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()
層會有什麼影響?原因為何?
我們一起試試看:
- 在
# 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)])
- 儲存並執行
updated_model.ipynb
的儲存格。
您會收到資料形狀的錯誤訊息,而這並非意外情況。
目前錯誤詳細資料可能無法提供確切資訊,但驗證了一項經驗法則:類神經網路的第一層應與資料形狀相同。輸入圖像的形狀為 28x28,但打造每層 28 個神經元共 28 層的架構並不可行,因此將 28x28 扁平化為 784x1 更為合理。
您可以一開始就新增 Flatten()
層,不必自己編寫所有程式碼來處理這項作業。稍後將陣列載入模型時,系統會自動進行扁平化。
練習 5
請留意最後一層 (輸出層),為什麼有 10 個神經元?如果數量不是 10,又會有什麼影響呢?
將數字調整為 5 並訓練類神經網路,一起看看結果。
- 將
# 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)])
- 將最後一層的神經元數量從 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)])
- 儲存並執行
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 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。