TensorFlow 2.0 快速搭建神經網絡


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
model = MyModel()
  使用 class 類封裝網絡結構,如上所示是一個 class 模板,MyModel 表示聲明的神經網絡的名字,括號中的 Model 表示創建的類需要繼承 tensorflow 庫中的 Model 類。
   __init__():定義所需網絡結構塊
  call():寫出前向傳播。

2 iris 數據集代碼示例

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()

 

 
 數據增強、斷點續存、acc/loss可視化等功能實現可參考 下一節


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM