【小白學PyTorch】15 TF2實現一個簡單的服裝分類任務

忽逢桃林發表於2020-09-29

【新聞】:機器學習煉丹術的粉絲的人工智慧交流群已經建立,目前有目標檢測、醫學影像、時間序列等多個目標為技術學習的分群和水群嘮嗑的總群,歡迎大家加煉丹兄為好友,加入煉丹協會。微信:cyx645016617.

參考目錄:

0 為什麼學TF

之前的15節課的pytorch的學習,應該是讓不少朋友對PyTorch有了一個全面而深刻的認識了吧 (如果你認真跑程式碼了並且認真看文章了的話)

大家都會比較Tensorflow2和pytorch之間孰優孰劣,但是我們也並不是非要二者選一,兩者都是深度學習的工具,其實我們或多或少應該瞭解一些比較好。 就好比,PyTorch是衝鋒槍,TensorFlow是步槍,在上戰場前,我們可以選擇帶上衝鋒槍還是步槍,但是在戰場上,可能手中的槍支沒有子彈了,你只能在地上隨便撿了一把槍。 很多時候,用Pytorch還是Tensorflow的選擇權不在自己。

此外,瞭解了TensorFlow,大家才能更好的理解PyTorch和TF究竟有什麼區別。我見過有的大佬是TF和PyTorch一起用在一個專案中,資料讀取用PyTorch然後模型用TF構建。

總之,大家有時間有精力的話,順便學學TF也不虧,更何況TF2.0現在已經優化了很多。本系列預計用3節課來簡單的入門一下Tensorflow2.

和PyTorch的第一課一樣,我們直接做一個簡單的小實戰。MNIST手寫數字分類,Fashion MNIST時尚服裝分類。

1 Tensorflow的安裝

安裝TensorFlow的方法很簡單,就是在控制檯執行:

pip install tensorflow --user

這裡的--user是賦予這個命令執行許可權的,一般我都會帶上。

2 資料集構建

# keras是TF的高階API,用起來更加的方便,一般也是用keras。
import tensorflow as tf
from tensorflow import keras
import numpy as np

匯入需要用到的庫函式. 正如torchvision.datasets中一樣,keras.datasets中也封裝了一些常用的資料集。

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
print('train_images shape:',train_images.shape)
print('train_labels shape:',train_labels.shape)
print('test_images shape:',test_images.shape)
print('test_labels shape:',test_labels.shape)

輸出結果是:

訓練資料集中有60000個樣本,每一個樣本和MNIST手寫數字大小是一樣的,是\(28\times 28\)大小的,然後每一個樣本有一個標籤,這個標籤和MNIST也是一樣的,是從0到9,是一個十分類任務。

來看一下這些類別有哪些:

標籤 類別 標籤 類別
0 T-shirt 5 Sandal
1 Trouser 6 Shirt
2 Pullover 7 Sneaker
3 Dress 8 Bag
4 Coat 9 Ankle boot

這裡學學單詞吧:

  • T-shirt就是T型的襯衫,就是短袖,我感覺前面沒有釦子的那種也叫T-shirt;
  • Shirt就是長袖的那種襯衫;
  • Trouser是褲子;
  • pullover是毛衣,套頭毛衣,就是常說的衛衣吧感覺;
  • dress連衣裙;
  • coat是外套;
  • sandal是涼鞋;
  • sneaker是運動鞋;
  • ankle boot是短靴,是到腳踝的那種靴子;
  • 這裡補充一個吧,sweater,是毛線衣,運動衫,這個和pullover有些類似,個人感覺主要的區分在於運動系列的可以叫做sweater,其他的毛衣衛衣是pullover。

運動短袖T-shirt+運動衛衣sweater是我秋天去健身房的穿搭。

2 預處理

這裡不做影像增強之類的了,上面的資料中,影像畫素值是從0到255的,我們要把這些標準化成0到1的範圍。

train_images = train_images / 255.0
test_images = test_images / 255.0

3 構建模型

# 模型搭建
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

這就是一個用keras構建簡單模型的例子:

  • keras.layers.Flatten是把\(28\times 28\)的二維度拉平成一個維度,因為這裡是直接用全連線層而不是卷積層進行處理的;
  • 後面跟上兩個全連線層keras.layers.Dense()就行了。我們可以發現,這個全連線層的引數和PyTorch是有一些區別的:
    1. PyTorch的全連線層需要一個輸入神經元數量和輸出數量torch.nn.Linear(5,10),而keras中的Dense是不需要輸入引數的keras.layers.Dense(10)
    2. keras中的啟用層直接封裝在了Dense函式裡面,所以不需要像PyTorch一樣單獨寫一個nn.ReLU()了。

4 優化器

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

定義優化器和損失函式,在keras中叫做對模型進行編譯compile(在C語言中,在執行程式碼之前都需要對程式碼進行編譯嘛)。損失函式和優化器還有metric衡量指標的設定都在模型的編譯函式中設定完成。

上面使用Adam作為優化器,然後損失函式用了交叉熵,然後衡量模型效能的使用了準確率Accuracy。

5 訓練與預測

model.fit(train_images, train_labels, epochs=10)

這就是訓練過程,相比PyTorch而言,更加的簡單簡潔,但是不像PyTorch那樣靈活。

test_loss, test_acc = model.evaluate(test_images, test_labels)
print('\nTest accuracy:', test_acc)

這個.evaluate方法是對模型的驗證集進行驗證的,因為本次任務中並沒有對訓練資料再劃分出驗證集,所以這裡直接使用測試資料了。

大家應該能理解訓練集、驗證集和測試集的用途和區別吧,我在第二課講過這個內容,在此不多加贅述。

predictions = model.predict(test_images)

這個.predict方法才是用在測試集上,進行未知標籤樣本的類別推理的。

本次內容到此為止,大家應該對keras和tensorflow有一個直觀淺顯的認識了。當然tensorflow也有一套類似於PyTorch中的dataset,dataloader的那樣自定義的資料集載入器的方法,在後續內容中會深入淺出的學一下。

相關文章