【新聞】:機器學習煉丹術的粉絲的人工智慧交流群已經建立,目前有目標檢測、醫學影像、時間序列等多個目標為技術學習的分群和水群嘮嗑的總群,歡迎大家加煉丹兄為好友,加入煉丹協會。微信: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是有一些區別的:- PyTorch的全連線層需要一個輸入神經元數量和輸出數量
torch.nn.Linear(5,10)
,而keras中的Dense是不需要輸入引數的keras.layers.Dense(10)
; - keras中的啟用層直接封裝在了Dense函式裡面,所以不需要像PyTorch一樣單獨寫一個
nn.ReLU()
了。
- PyTorch的全連線層需要一個輸入神經元數量和輸出數量
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的那樣自定義的資料集載入器的方法,在後續內容中會深入淺出的學一下。