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}')
上一篇講到前置導入的一些module以及簡介他們的作用,接下來從載入訓練及測試的數據集開始
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
// load_data() 是 MNIST 模塊中的一個函數,可以用來載入MNIST的數據集。這個函數返回兩個元組(tuple),每個元組包含兩個部分:圖像數據和對應的標籤。
圖像數據(images): 這是包含手寫數字圖像的 NumPy 陣列。對於 MNIST,圖像是灰度圖,每個圖像的大小為 28x28 像素。每個像素的值介於 0 到 255 之間,表示該位置的灰度值。
標籤(labels): 這是包含對應圖像的數字標籤的 NumPy 陣列。標籤是整數,表示手寫數字的真實值,範圍從 0 到 9。
// 這行程式碼使用多重賦值的方式,將 mnist.load_data() 返回的兩個元組分別賦值給 (train_images, train_labels) 和 (test_images, test_labels)。這樣,train_images 就包含了訓練圖像數據,train_labels 包含了對應的訓練標籤,同樣,test_images 和 test_labels 分別包含了測試圖像數據和對應的測試標籤。
總之,這段程式碼就是將 MNIST 數據集載入到四個變數中。
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(test)_images.reshape((60000, 28, 28, 1)): 這裡使用 reshape 方法將訓練圖像的形狀改變為 (60000, 28, 28, 1)。原本的形狀是 (60000, 28, 28),其中 60000 是訓練樣本數,而 (28, 28) 則是每個圖像的寬度和高度。這個 reshape 操作的目的是將每個圖像視為一個高度為 28、寬度為 28、通道數為 1(因為是灰度圖像)的三維陣列。
**通道(Channel)**指的是影像中的維度。對於灰度影像,通常只有一個通道,而對於彩色影像,通常有三個通道(紅色、綠色、藍色)。
當你看到 (28, 28, 1) 的時候,這表示每個影像是 28x28 像素的 灰度影像,其中的 1 表示通道數。如果是 (28, 28, 3) ,這表示每個影像是 28x28 像素的 彩色影像,其中的 3 表示通道數。
// astype('float32'):將數據的類型轉換為 float32。這是因為深度學習模型通常使用浮點數格式的數據,而原始的 MNIST 圖像數據是整數格式。
// / 255: 最後,對所有的像素值進行歸一化處理。將像素值除以 255,這樣處理可以將像素值縮放到 0 到 1 之間,這有助於模型的收斂和訓練效果。
下一篇會從標籤label的編碼開始講~