TensorFlow 2.0學習筆記(1):服飾影像分類
7 min readApr 9, 2020
2021/03/03更新檢查dataset時可以使用的程式
train_images[0] #查看training set中的第一張圖片
train_labels.max() #查看training set中最大的label (0~9則為9)
train_labels.min() #查看training set中最小的label (0~9則為0)
train_images[train_labels==2] #查看training set中,label是2的圖片tf.keras.utils.plot_model(model) #將搭建好的TensorFlow可視化呈現model.layers[1].weights #第二層layer的weights
model.layers[1].output #第二層layer的output#加入testing的資料,來查看val acc和val loss
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))#將對1張圖的prediction結果進行加總,如果使用softmax的話,加總值應該等於1
sum(predictions[0])
安裝套件
pip install -U tensorflow_datasets #用來下載、讀取dataset
載入套件
import tensorflow as tfimport tensorflow_datasets as tfdstfds.disable_progress_bar()import mathimport numpy as npimport matplotlib.pyplot as plt
本次的資料集選用Fashion MNIST dataset,該資料有70,000張灰階圖片,分成10個類別,28x28的圖片尺寸
載入資料
dataset, metadata = tfds.load('fashion_mnist', as_supervised=True, with_info=True)train_dataset, test_dataset = dataset['train'], dataset['test']#模型用train_dataset訓練;用test_dataset進行測試
建立標籤
class_names = ['T-shirt/top','Trouser','Pullover','Dress', 'Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']#該資料集有10種不同的標籤[0~9]
檢視資料
num_train_examples = metadata.splits['train'].num_examples
num_test_examples = metadata.splits['test'].num_examples
print("Number of training examples: {}".format(num_train_examples))
print("Number of test examples: {}".format(num_test_examples))# Number of training examples: 60000
# Number of test examples: 10000
預處理資料
#正規化將pixel從[0~255]變成[0~1]之間的範圍def normalize(images, labels): images = tf.cast(images, tf.float32) images /= 255 return images, labels# map函數將normalize函式映射到train_dataset和test_datasettrain_dataset = train_dataset.map(normalize)test_dataset = test_dataset.map(normalize)# 將圖片快取至記憶體當中,加快後續載入速度train_dataset = train_dataset.cache()test_dataset = test_dataset.cache()
檢視圖片
# 將圖片移除顏色for image, label in test_dataset.take(1): break image = image.numpy().reshape((28,28))# 單一圖片plt.figure()plt.imshow(image, cmap=plt.cm.binary)plt.colorbar()plt.grid(False)plt.show()# 顯示前25張圖片
plt.figure(figsize=(10,10))i = 0for (image, label) in test_dataset.take(25): image = image.numpy().reshape((28,28)) plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(image, cmap=plt.cm.binary) plt.xlabel(class_names[label]) i += 1plt.show()
建立模型
model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28, 1)), #輸入層 tf.keras.layers.Dense(128, activation=tf.nn.relu), #隱藏層 tf.keras.layers.Dense(10) #輸出層])#(input_shape=(28, 28, 1)),將圖片尺寸從28x28轉到1維陣列(784 pixels)
#(128, activation=tf.nn.relu),128個神經元、激活函數使用RELU
#(10),代表著輸出有10個類別
編譯模型
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])# optimizer:使用adam來降低損失
# loss:測量損失
# metrics:使用accuracy來衡量
訓練模型
BATCH_SIZE = 32train_dataset = train_dataset.cache().repeat().shuffle(num_train_examples).batch(BATCH_SIZE)test_dataset = test_dataset.cache().batch(BATCH_SIZE)model.fit(train_dataset, epochs=5, steps_per_epoch=math.ceil(num_train_examples/BATCH_SIZE))# .repeat()重複執行;
# .shuffle()打散資料,讓電腦不跟著順序訓練;
# .batch(BATCH_SIZE)每次使用32張圖片進行訓練
評估準確度
test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test_examples/32))print('Accuracy on test dataset:', test_accuracy)
進行預測
for test_images, test_labels in test_dataset.take(1): test_images = test_images.numpy() test_labels = test_labels.numpy() predictions = model.predict(test_images)predictions[0] #預測第一張圖片,顯示10個類別的信心分數
np.argmax(predictions[0]) #用numpy找出信心分數最高的類別
test_labels[0] #用test集判斷是否與預測結果一樣