首頁?學習  »   正文

TensorFlow 2.0實戰入門(上)

TensorFlow 2.0實戰入門(上)

如果你正在讀這篇文章,你可能接觸過神經網絡和TensorFlow,但是你可能會對與深度學習相關的各種術語感到有點畏縮,這些術語經常在許多技術介紹中被掩蓋或未被解釋。本文將深入介紹TensorFlow 2.0的初學者教程,從而讓大家對其中的一些主題有所了解。

注意:鑒于這是一個初學者指南,這里所表達的大部分思想都應該有一個較低的入門門檻,但是對什么是神經網絡有一定的背景知識會有所幫助。如果您想溫習一下,本文將提供一個很好的概述。

你將學到的

閱讀本文之后,您將更好地理解這些主題的一些關鍵概念主題和TysFrace/CARAS實現(Keras是一個構建在TensorFlow之上的深度學習庫)。

概念

  • 神經網絡層形狀
  • 激活功能(如Relu和Softmax)
  • Logits
  • Dropout
  • Optimizers
  • Loss
  • Epochs

TensorFlow / Keras功能:

  • keras.layers.Sequential()
  • keras.layers.Flatten()
  • keras.layers.Dense()
  • compile()
  • fit()

數據

TensorFlow 2.0初學者教程使用的數據是MNIST數據集,它被認為是一種“Hello, World!”用于神經網絡和深度學習,可以直接從Keras下載。它是一個滿是手繪數字0-9之間的數據集,并有一個相應的標簽描述繪圖應該描述的數字。

TensorFlow 2.0實戰入門(上)

來自MNIST數據集的示例觀察

使用此數據集的想法是,我們希望能夠訓練一個模型,該模型了解數字0–9對應的形狀類型,并隨后能夠正確地標記未經過訓練的圖像。當圖像(如下圖所示)傳遞給模型時,此任務變得更加復雜。有些人甚至會把這張圖誤認為是零,盡管它被標為8。

TensorFlow 2.0實戰入門(上)

示例來自mnist的模糊圖像

在較高的層次上,初學者教程中構建的模型將訓練圖像作為輸入,并嘗試將這些圖像分類為0到9之間的數字。如果預測錯誤,它將進行數學調整以更好地預測類似的圖像。一旦模型完成了培訓,它將在未培訓的圖像上進行測試,以最終評估模型的性能。

TensorFlow 2.0實戰入門(上)

基本結構的神經網絡建立在初學者的筆記本上

了解初學者筆記本

現在讓我們深入研究TensorFlow是如何實現這個基本神經網絡的。

加載數據

在第一個單元中進行了一些設置之后,筆記本電腦開始使用它的load_data()函數從keras庫加載mnist數據集,該函數返回兩個元組,如代碼所示。文檔可以在這里找到。

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) =

mnist.load_data()

當我們開始探索TensorFlow是如何處理這些數據的時,理解這些數據實際上是什么樣子將會很有幫助。

>>> x_train.shape

(60000, 28, 28)

>>> y_train.shape

(60000,)

>>> x_test.shape

(10000, 28, 28)

>>> y_test.shape

(10000,)

通過觀察這些結果,我們可以看到數據集中有70k個圖像,60k個訓練和10000個測試。這兩個28表示每個圖像是28像素乘28像素,圖像表示為28×28數組,其中填充了像素值,如下圖所示。

TensorFlow 2.0實戰入門(上)

描述每個圖像如何存儲在MNIST數據集中

筆記本準備數據的最后一步是將每張圖像中的每個像素值轉換為0.0 – 1.0之間的浮點數。這樣做是為了幫助計算出每幅圖像的預測所涉及的數學尺度。

x_train, x_test = x_train / 255.0, x_test / 255.0

構建模型結構

也許本筆記本最令人困惑的部分是創建模型結構的部分。

model = tf.keras.models.Sequential([

tf.keras.layers.Flatten(input_shape=(28, 28)),

tf.keras.layers.Dense(128, activation='relu'),

tf.keras.layers.Dropout(0.2),

tf.keras.layers.Dense(10, activation='softmax')

])

這段代碼的目的是指定在我們的神經網絡中會出現什么樣的層。第一個組件是tf.keras.models.sequential()調用。所有這些功能都是開始創建線性(或“順序”)的層排列。上面代碼片段中的所有其他代碼詳細說明了模型中的層以及它們的排列方式。

下一行代碼tf.keras.layers.flatten(input_shape=(28,28))創建網絡中的第一層。直觀地說,我們希望能夠使用圖像中的所有信息來預測它是什么數字,因此輸入層應該為圖像中的每個像素都有一個節點。每個圖像有28*28=784個值,因此flatten()創建一個包含784個節點的層,其中包含給定圖像的每個像素值。如果我們的彩色圖像每個像素包含3個值(RGB值),那么flatten()將創建一個節點為28*28*3=2352的層。

我們在模型中看到的另一種層是使用tf.keras.layers. density()創建的,它創建了所謂的完全連接層或緊密連接層。這可以與稀疏連接的層進行比較,區別在于相鄰層中的節點之間如何傳遞信息。

TensorFlow 2.0實戰入門(上)

密集和稀疏連接的比較(來自Mir Alavi博客的圖片)

可以看到,在一個密集連接的層中,一層中的每個節點都連接到下一層中的每個節點,而在稀疏連接的層中,情況并非如此。所以Dense()所做的就是創建一個完全連接到它前面的層的層。第一個參數(在第一個實例中是128)指定層中應該有多少個節點。隱藏層(不是輸入層或輸出層的層)中的節點數是任意的,但需要注意的是,輸出層中的節點數等于模型試圖預測的類的數量。在這種情況下,模型試圖預測10個不同的數字,因此模型中的最后一層有10個節點。這一點非常重要,因為最終層的每個節點的輸出將是給定圖像是特定數字的概率。

為了理解這段代碼中的其余部分,我們需要發展對激活函數和退出的理解。這一部分我們將在明天的文章里講到。

 

歡迎關注ATYUN官方公眾號,商務合作及內容投稿請聯系郵箱:[email protected]

發表評論