做者|Orhan Gazi Yalçın
編譯|VK
來源|Towards Datas Sciencepython
若是你看看不一樣的教程,搜索,花大量時間研究關於TensorFlow的Stack Overflow,你可能已經意識到有不少不一樣的方法來構建神經網絡模型。算法
這一直是TensorFlow面臨的問題。這就像是TensorFlow試圖找到通往光明的深度學習環境的道路。因爲TensorFlow是目前市場上最成熟的深度學習庫,這基本上是你能獲得的最好的。數據庫
TensorFlow發展成爲一個深度學習平臺並非一晚上之間發生的。最初,TensorFlow將本身推銷爲一個符號數學庫,用於跨一系列任務的數據流編程。所以,TensorFlow最初提供的主張並非一個純粹的機器學習庫。目標是建立一個高效的數學庫,以便在這種高效結構上構建的自定義機器學習算法可以在短期內以高精度進行訓練。編程
然而,用低級api重複地從頭構建模型並非很理想。所以,谷歌的工程師弗蘭•庫伊斯-克里特開發了Keras,做爲一個獨立的高層次的深度學習庫。雖然Keras已經可以運行在不一樣的庫之上,好比TensorFlow, Microsoft Cognitive Toolkit, Theano 或 PlaidML,可是TensorFlow過去和如今仍然是人們使用Keras的最多見的庫。api
在看到了模型構建過程當中的混亂以後,TensorFlow團隊宣佈Keras將成爲在tensorflow2.0中構建和訓練模型的核心高級API。另外一種高級API,Estimator api網絡
如今,讓咱們回到問題上來:有不少不一樣的方法,人們使用TensorFlow來構建他們的模型。這個問題的主要緣由是TensorFlow未能採用單一模型API。機器學習
在1.x版本中,對於生產級項目,模型構建API是Estimator API。可是,隨着最近的變化,keras api幾乎遇上了Estimator API。最初,Estimator API具備更高的可伸縮性,容許分佈式,而且具備方便的跨平臺功能。然而,如今Estimator API的大部分優勢都已被消除,所以,很快Keras API將極可能成爲構建TensorFlow模型的惟一標準API。分佈式
所以,在本文中,咱們將只關注在TensorFlow中構建模型的Keras API方法,其中有三種:函數
我將直接將它們與相應的模型構建代碼進行比較,這樣你就能夠實際測試它們了。讓咱們深刻研究編碼。性能
爲了測試這三種Keras方法,咱們須要選擇一個深度學習問題。利用MNIST進行圖像分類是一個很是簡單的任務。咱們試圖實現的是利用著名的MNIST數據集訓練一個識別手寫數字的模型。
MNIST數據集(MNIST dataset)是一個大型手寫數字數據庫,一般用於訓練各類圖像處理系統。MNIST數據庫包含6萬張訓練圖片和1萬張測試圖片,這些圖片來自美國人口普查局員工和美國高中生。若是你想遵循完整的教程,你能夠找到個人關於圖像分類的單獨教程:
https://towardsdatascience.co...
經過下面的代碼,咱們將導入全部層和模型,這樣在接下來的部分中就不會打擾咱們了。咱們還下載MNIST數據集並對其進行預處理,以便它能夠用於咱們將使用這三種不一樣方法構建的全部模型。只需運行如下代碼:
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Flatten, Dense from tensorflow.keras import Input from tensorflow.keras import Model from tensorflow.estimator import DNNClassifier from tensorflow.keras.datasets.mnist import load_data (x_train, y_train), (x_test, y_test)= load_data( path="mnist.npz" ) # 確保這些值是浮點數,這樣除法後就能夠獲得小數點 x_train = x_train.astype('float32') x_test = x_test.astype('float32') # 經過將RGB代碼除以最大RGB值來規範化 x_train /= 255 x_test /= 255
如今,這一部分已經結束,讓咱們集中討論構建張量流模型的三種方法。
有三種方法能夠在TensorFlow中構建Keras模型:
讓咱們看看這些方法是如何實現的。咱們將創建一個具備單一平坦層的基本前饋神經網絡,將二維圖像陣列轉換爲一維陣列和兩個全鏈接層。
在Sequential API中,咱們須要tf.keras.Models模塊。咱們能夠簡單地將下面的全部層做爲一個單獨的層來傳遞。如你所見,這很簡單。
model = Sequential([ Flatten(input_shape=(28, 28)), Dense(256,'relu'), Dense(10, "softmax"), ])
對於Functional API,咱們須要單獨定義咱們的輸入。而後,咱們須要建立一個輸出對象,同時建立全部層,這些層相互關聯並與輸出相關聯。最後,咱們建立一個接受輸入和輸出做爲參數的模型對象。代碼仍然很是乾淨,可是咱們在Functional API中有了更大的靈活性。
inputs = Input(shape=(28, 28)) x = Flatten()(inputs) x = Dense(256, "relu")(x) outputs = Dense(10, "softmax")(x) model = Model(inputs=inputs, outputs=outputs, name="mnist_model")
讓咱們繼續討論模型子類化。在模型子類化中,咱們從建立一個擴展類基於tf.keras.Model 。模型子類化有兩個關鍵功能:
__init__
函數充當構造函數。多虧了__init__
,咱們能夠初始化模型的屬性(例如,layer)。super調用父構造函數( tf.keras.Model中的構造函數)self用於引用實例屬性。爲了使用模型子類化來構建同一個模型,咱們須要編寫更多的代碼,以下所示:
class CustomModel(tf.keras.Model): def __init__(self, **kwargs): super(CustomModel, self).__init__(**kwargs) self.layer_1 = Flatten() self.layer_2 = Dense(256, "relu") self.layer_3 = Dense(10, "softmax") def call(self, inputs): x = self.layer_1(inputs) x = self.layer_2(x) x = self.layer_3(x) return x model = CustomModel(name='mnist_model')
如今你能夠用三種不一樣的方法建立同一個模型,你能夠選擇其中任何一個,構建模型,並運行下面的代碼。
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x=x_train,y=y_train, epochs=10) model.evaluate(x_test, y_test)
上面的行負責模型配置、訓練和評估。當咱們比較這三種方法的性能時,咱們發現它們很是接近,但略有不一樣。
Method | Sequential API | Functional API | Model Subclassing |
---|---|---|---|
Loss | 0.08746038377285004 | 0.08131594955921173 | 0.0781003013253212 |
Accuracy | 97.82% | 98.06% | 98.20% |
咱們更復雜的模型子類化方法優於Sequential API和Functional API。這代表,這些方法在低端的設計上也有細微差異。然而,這些差別能夠忽略不計。
如今,你已經瞭解了這三種Keras方法之間的異同。可是,讓咱們用一個表格來總結一下:
Feature | Sequential API | Functional API | Model Subclassing |
---|---|---|---|
Customization | Low | Medium | High |
Difficulty to Build | Easy | Medium | Difficult |
Layer Sharing | No | Yes | Yes |
Multiple Branch | No | Yes | Yes |
Multiple Input | No | Yes | Yes |
Multiple Output | No | Yes | Yes |
Best Suited For | Beginners | Professionals | Resarchers |
總之,若是你剛剛起步,請堅持使用Sequential API。在深刻研究更復雜的模型時,請嘗試Functional API。若是你正在攻讀博士學位,或者只是喜歡進行獨立研究,試試模型子類化。若是你是專業人士,請堅持使用Functional API。它可能會知足你的須要。
原文連接:https://towardsdatascience.co...
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/