iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

今天要繼續講解前一篇未講完的CNN網路的程式碼


一樣先把完整的程式碼貼上來

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical


(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)


model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))


model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])


model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))


test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')          

上一篇講到模型內層的建置,今天從模型的編譯開始講~

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

在編譯模型時,我們需要先設定三個值,分別是優化器、損失函數、和評估模型的標準。

之前CNN的篇幅中沒有介紹到優化器和損失函數,這邊先簡單介紹

optimizer(優化器) 是模型在訓練過程中使用的優化算法。優化器的作用是最小化或最大化損失函數,從而使模型的預測更接近實際值。
損失函數(Loss Function) 是深度學習模型中的一個重要組件,他衡量了模型預測的輸出與實際目標的差異,用來衡量模型在訓練過程中的性能。優化器的目標就是最小化損失函數的值,使得模型的預測盡可能接近實際目標。

接著就開始講解程式碼
// optimizer='adam': 指定了優化器的類型,使用 Adam 優化器。Adam 是一種常用的自適應學習率優化算法,能夠有效地調整每個權重的學習率,進而加速收斂過程。Adam 優化器是深度學習中的一個常見選擇,通常能夠在不同類型的任務中表現良好。
//loss='categorical_crossentropy' : 指定了損失函數的類型,使用了 categorical crossentropy。對於多類別分類問題,特別是使用 softmax 激活函數的情況,categorical crossentropy 是一個常見的選擇。它衡量模型預測的概率分佈與實際標籤的差異,並將這個差異作為訓練過程中的損失。

為什麼使用 softmax 激活函數的情況,就常會使用categorical crossentropy(分類交叉熵)為損失函數呢?

在多類別分類的情況中,常使用 softmax 激活函數來產生每個類別的概率分佈。softmax 函數將模型的輸出轉換成一個概率分佈,使所有類別的概率總和為 1。而 categorical crossentropy 正是針對這種概率分佈設計的損失函數,可以很好的衡量預測概率分佈與實際標籤的差異。
categorical crossentropy 能夠處理多類別分類的問題,並對每個類別進行區分。對於每個樣本,損失函數計算模型預測的概率分佈與實際的 one-hot 編碼標籤之間的差異。
// metrics=['accuracy'] : 在訓練時,我們通常會follow一些指標來評估模型的性能。這裡使用 accuracy 作為評估指標,就是模型在訓練集上的準確率。

model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))

這裡使用 Keras 中的 fit 方法,這個方法可以訓練(fit)模型。一樣需要設定一些參數。

// epochs: ,模型訓練的次數。每一次 epoch 模型就會完整經歷一次訓練數據集。這個值通常是整數。
// batch_size: 每次更新模型權重所使用的樣本數。在每個 epoch 中,數據集將被分為多個批次,每個批次包含指定數量的樣本。
// 用於在訓練過程中評估模型性能的驗證數據。這是一個元組,裡面要放驗證數據的輸入特徵和對應的標籤(test images and labels)。每個 epoch 結束時,模型根據這些數據的性能進行評估。

test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')

// evaluate 方法的return值是一個包含兩個值的元組,第一個值是測試數據上的損失(test loss),第二個值是模型在測試數據上的指定評估指標(這裡是準確度,test accuracy)。
請注意,這邊的test_acc和前面的accuracy是不一樣的!
test_acc是在模型訓練結束後,使用測試數據集計算的準確度。這個值用於評估模型對於未見過的數據(測試數據)的泛化性能。
accuracy是在模型訓練過程中,使用訓練數據集計算的準確度。這個值用於監控模型在訓練過程中對訓練數據的擬合程度。

//最後print就是將test_acc給印出來啦


以下是程式碼截圖和執行終端結果
https://ithelp.ithome.com.tw/upload/images/20231011/20160630utSRtCFTdU.png
https://ithelp.ithome.com.tw/upload/images/20231011/20160630nKMALVxwcJ.png
這邊前面import出現了幾個errors,我自己猜可能是因為新版本中, Keras 已經被整合到 TensorFlow 中。或者是PyCharm沒有讀到我的環境中有tensorflow keras,因為程式碼其實是可以順利執行的!
至於執行完終端的應該紅字是在講一些CUDA和cuDNN某個函數的小問題,不過執行這種很簡單的cnn網路基本上是不會有什麼影響的!


那這個辨識手寫數字的簡單cnn網路就告一段落~


上一篇
Day25 在python環境實作 CNN捲積神經網路(下)
下一篇
Day27 VITS語音訓練(上)
系列文
AI語音模型訓練: machine learning 和 deep learning 的學習與應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言