TensorFlow 2.0 快速搭建神經網路
阿新 • • 發佈:2020-08-02
tf.keras 是 TensorFlow2 引入的高度封裝框架,可以快速搭建神經網路模型。下面介紹一些常用API,更多內容可以參考官方文件:tensorflow
1 tf.keras 搭建神經網路六步法
- import
- train, test
- model = tf.keras.models.Sequential
- model.compile
- model.fit
- model.summary
1.1 import 相關模組
如 import tensorflow as tf
1.2 指定輸入網路的訓練集和測試集
如指定訓練集的輸入 x_train 和標籤 y_train,測試集的輸入 x_test 和 y_test。
1.3 逐層搭建網路結構
model = tf.keras.models.Sequential()
model = tf.keras.models.Sequential()
Sequential函式是一個容器,描述了神經網路的網路結構,在 Sequential函式的輸入引數中描述從輸入層到輸出層的網路結構。
網路結構示例:
# 拉直層 tf.keras.layers.Flatten()
# 全連線層 tf.keras.layers.Dense( 神經元個數, activation=”啟用函式”, kernel_regularizer=”正則化方式”) # 可選引數 # activation: relu、softmax、sigmoid、tanh 等 # kernel_regularizer: tf.keras.regularizers.l1()、tf.keras.regularizers.l2()
# 卷積層 tf.keras.layers.Conv2D( filter = 卷積核個數, kernel_size = 卷積核尺寸, strides = 卷積步長, padding = “valid” or“same”)
用於正則化的 範數。
1.4配置神經網路的訓練方法
告知訓練時使用的優化器、損失函式和準確率評測標準。model.compile( optimizer = 優化器, loss = 損失函式, metrics = [“準確率”])optimizer 可以是字串形式給出的優化器名字,也可以是函式形式,使用函式形式可以設定學習率、動量和超引數。詳細可參考:神經網路中的優化器
‘sgd’or tf.optimizers.SGD( lr=學習率, decay=學習率衰減率, momentum=動量引數) ‘adagrad’or tf.keras.optimizers.Adagrad(lr=學習率, decay=學習率衰減率) ‘adadelta’or tf.keras.optimizers.Adadelta(lr=學習率, decay=學習率衰減率) ‘adam’or tf.keras.optimizers.Adam (lr=學習率, decay=學習率衰減率)loss 可以是字串形式給出的損失函式的名字,也可以是函式形式。詳細可參考:神經網路中的損失函式
‘mse’or tf.keras.losses.MeanSquaredError() ‘sparse_categorical_crossentropy’ or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)損失函式常需要經過 softmax 等函式將輸出轉化為概率分佈的形式。from_logits 則用來標註該損失函式是否需要轉換為概率的形式,取 False 時表示轉化為概率分佈,取 True 時表示沒有轉化為概率分佈,直接輸出。 metrics 標註網路評測指標。注意,metrics 可以為複數形式,即指定多個 metrics。
‘accuracy’:y_和 y 都是數值。
如 y_=[1] y=[1]。 ‘categorical_accuracy’:y_和 y 都是以獨熱碼和概率分佈表示。 如 y_=[0, 1, 0], y=[0.256, 0.695, 0.048]。 ‘sparse_ categorical_accuracy’:y_是以數值形式給出,y 是以獨熱碼形式給出。 如 y_=[1],y=[0.256, 0.695, 0.048]。
1.5 執行訓練過程
model.fit(訓練集的輸入特徵, 訓練集的標籤,
batch_size,
epochs,
validation_data = (測試集的輸入特徵,測試集的標籤),
validataion_split = 從訓練集劃分多少比例給測試集,
validation_freq = 測試的epoch間隔次數)
更多引數可見:model.fit()。
關於 batch_size、epochs、iteration 區別。
關於 訓練集、驗證集、測試集 概念。
1.6列印網路結構和引數統計
model.summary()
1.7 class宣告網路結構
使用 Sequential 可以快速搭建網路結構,但是如果網路包含跳連等其他複雜網路結構,Sequential 就無法表示了。這就需要使用 class 來宣告網路結構。class MyModel(Model): def __init__(self): super(MyModel, self).__init__() 初始化網路結構 def call(self, x): y = self.d1(x) return y使用 class 類封裝網路結構,如上所示是一個 class 模板,MyModel 表示宣告的神經網路的名字,括號中的 Model 表示建立的類需要繼承 tensorflow 庫中的 Model 類。 __init__():定義所需網路結構塊 call():寫出前向傳播。
model = MyModel()
2iris 資料集程式碼示例
import tensorflow as tf from sklearn import datasets import numpy as np x_train = datasets.load_iris().data y_train = datasets.load_iris().target np.random.seed(116) np.random.shuffle(x_train) np.random.seed(116) np.random.shuffle(y_train) model = tf.keras.Sequential([ tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2()) ]) model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=[tf.keras.metrics.sparse_categorical_accuracy]) model.fit(x_train, y_train, batch_size=32, epochs=500, validation_freq=20, validation_split=0.2) model.summary()如果我們使用 class 申明網路結構,可寫成如下形式:
import tensorflow as tf from sklearn import datasets import numpy as np x_train = datasets.load_iris().data y_train = datasets.load_iris().target np.random.seed(116) np.random.shuffle(x_train) np.random.seed(116) np.random.shuffle(y_train) class IrisModel(tf.keras.Model): def __init__(self): super(IrisModel, self).__init__() self.d1 = tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2()) def call(self, inputs, training=None, mask=None): y = self.d1(inputs) return y model = IrisModel() model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=[tf.keras.metrics.sparse_categorical_accuracy]) model.fit(x_train, y_train, batch_size=32, epochs=10, validation_freq=2, validation_split=0.2) model.summary()
3 MNIST 資料集程式碼示例
MNIST 資料集是一個有七萬張圖片、28×28 畫素的 0~9 手寫數字資料集。其中六萬張用於訓練,一萬張用於測試。import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation=tf.keras.activations.relu), tf.keras.layers.Dense(10, activation=tf.keras.activations.softmax) ]) model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=[tf.keras.metrics.sparse_categorical_accuracy]) model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1) model.summary()
使用 class 申明網路結構
import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 print(x_train.shape) class MnistModel(tf.keras.Model): def __init__(self): super(MnistModel, self).__init__() self.flatten = tf.keras.layers.Flatten() self.d1 = tf.keras.layers.Dense(128, activation=tf.keras.activations.relu) self.d2 = tf.keras.layers.Dense(10, activation=tf.keras.activations.softmax) def call(self, inputs, training=None, mask=None): x = self.flatten(inputs) x = self.d1(x) y = self.d2(x) return y model = MnistModel() model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=[tf.keras.metrics.sparse_categorical_accuracy]) model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1) model.summary()