訓(xùn)練您的第一個(gè)神經(jīng)網(wǎng)絡(luò):基本分類Fashion MNIST(tensorflow2.0官方教程翻譯)

最全tensorflow2.0學(xué)習(xí)路線 https://www.mashangxue123.com
最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-keras-basic_classification.html
英文版本:https://tensorflow.google.cn/alpha/tutorials/keras/basic_classification
翻譯建議PR:https://github.com/mashangxue/tensorflow2-zh/edit/master/r2/tutorials/keras/basic_classification.md

本指南會(huì)訓(xùn)練一個(gè)對(duì)服飾(例如運(yùn)動(dòng)鞋和襯衫)圖像進(jìn)行分類的神經(jīng)網(wǎng)絡(luò)模型茁计。即使您不了解所有細(xì)節(jié)也沒關(guān)系薄货,本教程只是簡(jiǎn)要介紹了一個(gè)完整的 TensorFlow 程序优俘,而且后續(xù)我們會(huì)詳細(xì)介紹曹傀。

本指南使用的是tf.keras,它是一種用于在 TensorFlow 中構(gòu)建和訓(xùn)練模型的高階 API端辱。

安裝

pip install tensorflow==2.0.0-alpha0

導(dǎo)入相關(guān)庫(kù)

from __future__ import absolute_import, division, print_function, unicode_literals

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)

1. 導(dǎo)入MNIST數(shù)據(jù)集

本指南使用Fashion MNIST數(shù)據(jù)集,其中包含 70000 張灰度圖像,涵蓋 10 個(gè)類別髓帽。以下圖像顯示了單件服飾在較低分辨率(28x28 像素)下的效果:

<table>
<tr><td>
<img src="https://tensorflow.google.cn/images/fashion-mnist-sprite.png"
alt="Fashion MNIST sprite" width="600">
</td></tr>
<tr><td align="center">
<b>Figure 1.</b> <a >Fashion-MNIST 樣本</a>
</td></tr>
</table>

Fashion MNIST 的作用是成為經(jīng)典 MNIST 數(shù)據(jù)集的簡(jiǎn)易替換,后者通常用作計(jì)算機(jī)視覺機(jī)器學(xué)習(xí)程序的“Hello, World”入門數(shù)據(jù)集脑豹。MNIST數(shù)據(jù)集包含手寫數(shù)字(0氢卡、1、2 等)的圖像晨缴,這些圖像的格式與我們?cè)诒窘坛讨惺褂玫姆棃D像的格式相同译秦。

本指南使用 Fashion MNIST 實(shí)現(xiàn)多樣化,并且它比常規(guī) MNIST更具挑戰(zhàn)性击碗。這兩個(gè)數(shù)據(jù)集都相對(duì)較小筑悴,用于驗(yàn)證某個(gè)算法能否如期正常運(yùn)行。它們都是測(cè)試和調(diào)試代碼的良好起點(diǎn)稍途。

我們將使用 60000 張圖像訓(xùn)練網(wǎng)絡(luò)阁吝,并使用 10000 張圖像評(píng)估經(jīng)過學(xué)習(xí)的網(wǎng)絡(luò)分類圖像的準(zhǔn)確率。您可以從 TensorFlow 直接訪問 Fashion MNIST械拍,只需導(dǎo)入和加載數(shù)據(jù)即可:

fashion_mnist = keras.datasets.fashion_mnist

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

加載數(shù)據(jù)返回4個(gè)NumPy數(shù)組:

  • train_imagestrain_labels數(shù)組是訓(xùn)練集突勇,即模型用于學(xué)習(xí)的數(shù)據(jù)装盯。
  • 測(cè)試集 test_imagestest_labels 數(shù)組用于測(cè)試模型。

圖像為28x28的NumPy數(shù)組甲馋,像素值介于0到255之間埂奈。標(biāo)簽是整數(shù)數(shù)組,介于0到9之間定躏。這些標(biāo)簽對(duì)應(yīng)于圖像代表的服飾所屬的類別:

image.png

每個(gè)圖像都映射到一個(gè)標(biāo)簽账磺,由于類名不包含在數(shù)據(jù)集中,因此將它們存儲(chǔ)在此處以便在繪制圖像時(shí)使用:

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

2. 探索數(shù)據(jù)

我們先探索數(shù)據(jù)集的格式痊远,然后再訓(xùn)練模型垮抗。以下內(nèi)容顯示訓(xùn)練集中有 60000 張圖像,每張圖像都表示為 28x28 像素:

train_images.shape

(60000, 28, 28)

同樣碧聪,訓(xùn)練集中有60,000個(gè)標(biāo)簽:

len(train_labels)

60000

每個(gè)標(biāo)簽都是0到9之間的整數(shù):

train_labels

array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)

測(cè)試集中有10,000個(gè)圖像冒版。同樣,每個(gè)圖像表示為28 x 28像素:

test_images.shape

(10000, 28, 28)

測(cè)試集包含10,000個(gè)圖像標(biāo)簽:

len(test_labels)

10000

3. 預(yù)處理數(shù)據(jù)

在訓(xùn)練網(wǎng)絡(luò)之前必須對(duì)數(shù)據(jù)進(jìn)行預(yù)處理逞姿。 如果您檢查訓(xùn)練集中的第一個(gè)圖像辞嗡,您將看到像素值落在0到255的范圍內(nèi):

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
image

我們將這些值縮小到 0 到 1 之間,然后將其饋送到神經(jīng)網(wǎng)絡(luò)模型哼凯。為此欲间,將圖像組件的數(shù)據(jù)類型從整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù),然后除以 255断部。以下是預(yù)處理圖像的函數(shù):

務(wù)必要以相同的方式對(duì)訓(xùn)練集和測(cè)試集進(jìn)行預(yù)處理:

train_images = train_images / 255.0

test_images = test_images / 255.0

為了驗(yàn)證數(shù)據(jù)的格式是否正確以及我們是否已準(zhǔn)備好構(gòu)建和訓(xùn)練網(wǎng)絡(luò)猎贴,讓我們顯示訓(xùn)練集中的前25個(gè)圖像,并在每個(gè)圖像下方顯示類名蝴光。

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()
png

4. 構(gòu)建模型

構(gòu)建神經(jīng)網(wǎng)絡(luò)需要配置模型的層她渴,然后編譯模型。

4.1. 設(shè)置圖層

神經(jīng)網(wǎng)絡(luò)的基本構(gòu)造塊是層蔑祟。層從饋送到其中的數(shù)據(jù)中提取表示結(jié)果趁耗。希望這些表示結(jié)果有助于解決手頭問題。

大部分深度學(xué)習(xí)都會(huì)把簡(jiǎn)單的層連在一起疆虚。大部分層(例如 tf.keras.layers.Dense)都具有在訓(xùn)練期間要學(xué)習(xí)的參數(shù)苛败。

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

該網(wǎng)絡(luò)中的第一層tf.keras.layers.Flatten將圖像的格式從二維數(shù)組(28 x 28像素)轉(zhuǎn)換為一維數(shù)組(28 * 28 = 784像素))【恫荆可以將該層視為圖像中像素未堆疊的行罢屈,并排列這些行。該層沒有要學(xué)習(xí)的參數(shù)篇亭;它只改動(dòng)數(shù)據(jù)的格式缠捌。

在像素被展平之后,網(wǎng)絡(luò)由兩個(gè)tf.keras.layers.Dense層的序列組成译蒂。這些是密集連接或全連接的神經(jīng)層曼月。第一個(gè)Dense層有128個(gè)節(jié)點(diǎn)(或神經(jīng)元)谊却。第二個(gè)(也是最后一個(gè))層是具有 10 個(gè)節(jié)點(diǎn)的 softmax 層,該層會(huì)返回一個(gè)具有 10 個(gè)概率得分的數(shù)組哑芹,這些得分的總和為 1炎辨。每個(gè)節(jié)點(diǎn)包含一個(gè)得分,表示當(dāng)前圖像屬于 10 個(gè)類別中某一個(gè)的概率绩衷。

4.2. 編譯模型

模型還需要再進(jìn)行幾項(xiàng)設(shè)置才可以開始訓(xùn)練蹦魔。這些設(shè)置會(huì)添加到模型的編譯步驟:

  • 損失函數(shù):衡量模型在訓(xùn)練期間的準(zhǔn)確率激率。我們希望盡可能縮小該函數(shù)咳燕,以“引導(dǎo)”模型朝著正確的方向優(yōu)化。
  • 優(yōu)化器:根據(jù)模型看到的數(shù)據(jù)及其損失函數(shù)更新模型的方式乒躺。
  • 度量標(biāo)準(zhǔn):用于監(jiān)控訓(xùn)練和測(cè)試步驟招盲。以下示例使用準(zhǔn)確率,即圖像被正確分類的比例嘉冒。
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

5. 訓(xùn)練模型

訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型需要以下步驟:

  1. 將訓(xùn)練數(shù)據(jù)饋送到模型中曹货,在本示例中為 train_imagestrain_labels 數(shù)組。
  2. 模型學(xué)習(xí)將圖像與標(biāo)簽相關(guān)聯(lián)讳推。
  3. 我們要求模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè)顶籽,在本示例中為 test_images 數(shù)組。我們會(huì)驗(yàn)證預(yù)測(cè)結(jié)果是否與 test_labels 數(shù)組中的標(biāo)簽一致银觅。

要開始訓(xùn)練礼饱,請(qǐng)調(diào)用 model.fit 方法,使模型與訓(xùn)練數(shù)據(jù)“擬合”:

model.fit(train_images, train_labels, epochs=5)
Epoch 1/5
60000/60000 [==============================] - 5s 87us/step - loss: 0.5033 - acc: 0.8242
......
Epoch 5/5
60000/60000 [==============================] - 5s 88us/step - loss: 0.2941 - acc: 0.8917

在模型訓(xùn)練期間究驴,系統(tǒng)會(huì)顯示損失和準(zhǔn)確率指標(biāo)镊绪。該模型在訓(xùn)練數(shù)據(jù)上的準(zhǔn)確率達(dá)到 0.88(即 88%)。

6. 評(píng)估精度

接下來洒忧,比較模型在測(cè)試數(shù)據(jù)集上的表現(xiàn)情況:

test_loss, test_acc = model.evaluate(test_images, test_labels)

print('\nTest accuracy:', test_acc)

輸出:

10000/10000 [==============================] - 1s 50us/step
Test accuracy: 0.8734

結(jié)果表明蝴韭,模型在測(cè)試數(shù)據(jù)集上的準(zhǔn)確率略低于在訓(xùn)練數(shù)據(jù)集上的準(zhǔn)確率。訓(xùn)練準(zhǔn)確率和測(cè)試準(zhǔn)確率之間的這種差異表示出現(xiàn)過擬合(overfitting)熙侍。如果機(jī)器學(xué)習(xí)模型在新數(shù)據(jù)上的表現(xiàn)不如在訓(xùn)練數(shù)據(jù)上的表現(xiàn)榄鉴,也就是泛化性不好,就表示出現(xiàn)過擬合蛉抓。

7. 預(yù)測(cè)

模型經(jīng)過訓(xùn)練后庆尘,我們可以使用它對(duì)一些圖像進(jìn)行預(yù)測(cè)。

predictions = model.predict(test_images)

在本示例中芝雪,模型已經(jīng)預(yù)測(cè)了測(cè)試集中每張圖像的標(biāo)簽减余。我們來看看第一個(gè)預(yù)測(cè):

predictions[0]

輸出:

array([6.2482708e-05, 2.4860196e-08, 9.7165821e-07, 4.7436039e-08,
       2.0804382e-06, 1.3316551e-02, 9.8731316e-06, 3.4591161e-02,
       1.2390658e-04, 9.5189297e-01], dtype=float32)

預(yù)測(cè)結(jié)果是一個(gè)具有 10 個(gè)數(shù)字的數(shù)組,這些數(shù)字說明模型對(duì)于圖像對(duì)應(yīng)于 10 種不同服飾中每一個(gè)服飾的“confidence(置信度)”惩系。我們可以看到哪個(gè)標(biāo)簽的置信度值最大:

np.argmax(predictions[0])

9

因此位岔,模型非常確信這張圖像是踝靴或?qū)儆?class_names[9]如筛。我們可以檢查測(cè)試標(biāo)簽以查看該預(yù)測(cè)是否正確:

test_labels[0]

9

我們可以將該預(yù)測(cè)繪制成圖來查看全部 10 個(gè)通道

def plot_image(i, predictions_array, true_label, img):
  predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  predictions_array, true_label = predictions_array[i], true_label[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)

  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

讓我們看看第0個(gè)圖像,預(yù)測(cè)和預(yù)測(cè)數(shù)組抒抬。

i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions,  test_labels)
plt.show()
png
i = 12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions,  test_labels)
plt.show()
png

我們用它們的預(yù)測(cè)繪制幾張圖像杨刨。正確的預(yù)測(cè)標(biāo)簽為藍(lán)色,錯(cuò)誤的預(yù)測(cè)標(biāo)簽為紅色擦剑。數(shù)字表示預(yù)測(cè)標(biāo)簽的百分比(總計(jì)為 100)妖胀。請(qǐng)注意,即使置信度非常高惠勒,也有可能預(yù)測(cè)錯(cuò)誤赚抡。

# 繪制前X個(gè)測(cè)試圖像,預(yù)測(cè)標(biāo)簽和真實(shí)標(biāo)簽纠屋。 
# 用藍(lán)色標(biāo)記正確的預(yù)測(cè)涂臣,用紅色標(biāo)記錯(cuò)誤的預(yù)測(cè)。
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions, test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions, test_labels)
plt.show()
png

最后售担,使用訓(xùn)練的模型對(duì)單個(gè)圖像進(jìn)行預(yù)測(cè)赁遗。

# 從測(cè)試數(shù)據(jù)集中獲取圖像
img = test_images[0]

print(img.shape)

tf.keras模型已經(jīng)過優(yōu)化,可以一次性對(duì)樣本批次或樣本集進(jìn)行預(yù)測(cè)族铆。因此岩四,即使我們使用單個(gè)圖像,仍需要將其添加到列表中:

# 將圖像添加到批次中哥攘,它是唯一的成員剖煌。 
img = (np.expand_dims(img,0))

print(img.shape)

(1, 28, 28)

現(xiàn)在預(yù)測(cè)此圖像的正確標(biāo)簽:

predictions_single = model.predict(img)

print(predictions_single)
plot_value_array(0, predictions_single, test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)
png

model.predict返回一組列表,每個(gè)列表對(duì)應(yīng)批次數(shù)據(jù)中的每張圖像献丑。(僅)獲取批次數(shù)據(jù)中相應(yīng)圖像的預(yù)測(cè)結(jié)果:

np.argmax(predictions_single[0])

9

和前面的一樣末捣,模型預(yù)測(cè)標(biāo)簽為9。

最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-keras-basic_classification.html
英文版本:https://tensorflow.google.cn/alpha/tutorials/keras/basic_classification
翻譯建議PR:https://github.com/mashangxue/tensorflow2-zh/edit/master/r2/tutorials/keras/basic_classification.md

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末创橄,一起剝皮案震驚了整個(gè)濱河市箩做,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妥畏,老刑警劉巖邦邦,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異醉蚁,居然都是意外死亡燃辖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門网棍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔龟,“玉大人,你說我怎么就攤上這事∈仙恚” “怎么了巍棱?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蛋欣。 經(jīng)常有香客問我航徙,道長(zhǎng),這世上最難降的妖魔是什么陷虎? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任到踏,我火速辦了婚禮,結(jié)果婚禮上尚猿,老公的妹妹穿的比我還像新娘窝稿。我一直安慰自己,他們只是感情好谊路,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布讹躯。 她就那樣靜靜地躺著菩彬,像睡著了一般缠劝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骗灶,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天惨恭,我揣著相機(jī)與錄音,去河邊找鬼耙旦。 笑死脱羡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的免都。 我是一名探鬼主播锉罐,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绕娘!你這毒婦竟也來了脓规?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤险领,失蹤者是張志新(化名)和其女友劉穎侨舆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绢陌,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挨下,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脐湾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臭笆。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愁铺,到底是詐尸還是另有隱情凿菩,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布帜讲,位于F島的核電站衅谷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏似将。R本人自食惡果不足惜获黔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望在验。 院中可真熱鬧玷氏,春花似錦、人聲如沸腋舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)块饺。三九已至赞辩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間授艰,已是汗流浹背辨嗽。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淮腾,地道東北人糟需。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谷朝,于是被迫代替她去往敵國(guó)和親洲押。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容