tf.keras + Sequential() 可以搭建出上層輸入就是下層輸出的順序網絡結構,但是無法寫出一些帶有跳連的非順序網絡結構。
這時候可以選擇用類 class 搭建神經網絡結構,即使用 class 類封裝一個網絡結構:
...
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
定義網絡結構塊
def call(self, x):
調用網絡結構塊,實現前向傳播
return y
model = MyModel()...
可以認為 __init__() 函數准備出了搭建網絡所需的各種積木,call() 函數調用積木完成了神經網絡的搭建,即實現前向傳播,從輸入x到輸出y。
六步:
- import 相關模塊。
- 指定要喂入網絡的訓練集和測試集。
- class MyModel(Model) model = MyModel()
- 在 compile() 中配置訓練方法。
- 在 fit() 中執行訓練過程。
- 用 summary() 打印出網絡的結構和參數統計。
代碼:
import tensorflow as tf from tensorflow.keras.layers import Dense from tensorflow.keras import Model 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) tf.random.set_seed(116) # 定義神經網絡類
class IrisModel(Model): def __init__(self): super(IrisModel, self).__init__() # 定義第一層網絡結構:含有三個神經元的全連接層
self.d1 = Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2()) def call(self, x): # 調用網絡結構,實現前向傳播
y = self.d1(x) return y # 聲明神經網絡模型對象
model = IrisModel() # 配置訓練方法
model.compile(optimizer=tf.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_split=0.2, validation_freq=20) # 打印網絡的結構和參數
model.summary()