tf.keras 是 tensorflow API,可以快速搭建神經網絡模型。
六步:
- import 相關模塊。
- 指定要喂入網絡的訓練集和測試集。
- 在 Sequential() 中搭建網絡結構。
- 在 compile() 中配置訓練方法。
- 在 fit() 中執行訓練過程。
- 用 summary() 打印出網絡的結構和參數統計。
可以認為是一種容器,這個容器封裝了一個神經網絡結構。
在 Sequential() 中,要描述從輸入層到輸出層每一層的網絡結構。
model = tf.keras.models.Sequential([網絡結構])
每一層的網絡結構可以是:
拉直層:不含計算,只是形狀轉換,把輸入特征拉直成一維數組
tf.keras.layers.Flatten()
全連接層:
tf.keras.layers.Dense(神經元個數, activation="激活函數", kernel_regularizer=哪種正則化)
- 激活函數可以選擇:“relu”,“softmax”,“sigmoid”,“tanh”(以字符串給出)
- 正則化可以選擇:
tf.keras.regularizers.l1()
tf.keras.regularizers.l2()
卷積神經網絡層
循環神經網絡層
配置神經網絡的訓練方法,告知訓練時選擇的優化器、損失函數和評測指標。
model.compile(optimizer=優化器, loss=損失函數, metrics=["評測指標"])
- 優化器可以是字符串形式給出的優化器名字:“sgd”,“adagrad”,“adadelta”,“adam”
還可以是函數形式:
tf.keras.optimizers.SGD(lr=學習率, momentum=動量參數)
tf.keras.optimizers.Adagrad(lr=學習率)
tf.keras.optimizers.Adadelta(lr=學習率)
tf.keras.optimizers.Adam(lr=學習率, beta_1=0.9, beta_2=0.999)
- loss 可以是字符串給出的損失函數名字:“mse”,“sparse_categorical_crossentropy”
也可以是函數形式:
tf.keras.losses.MSE()
tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
有些神經網絡的輸出是經過了softmax函數的概率分布,有些則不經概率分布直接輸出。
可以認為 from_logits 這個參數是在詢問:是否是原始輸出,即沒有經過概率分布的輸出。
如果神經網絡預測結果輸出前經過了概率分布,寫False;
如果神經網絡預測結果輸出前沒有經過概率分布,寫True。
- metrics 告知網絡評測指標:
y_:標簽,y:預測結果
“accuracy”:y_和y都是以數字形式給出
“categorical_accuracy”:y_和y都是以獨熱碼(概率分布)的形式給出
“sparse_categorical_accuracy”:y_以數值形式給出,y以獨熱碼形式給出
執行訓練過程。
model.fit(訓練集的輸入特征, 訓練集的標簽,
batch_size=, epochs=,
validation_data=(測試集的輸入特征, 測試集的標簽),
validation_split=從訓練集中划分多少比例給測試集,
validation_freq=多少次epoch測試一次 )
- validation_data,validation_split 二選其一
summary()
打印出網絡的結構和參數統計。
鳶尾花分類代碼:(不使用 tf.keras API的代碼)
# import 相關模塊
import tensorflow as tf import numpy as np from sklearn import datasets # 指定要喂入網絡的訓練集和測試集
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) # 在 Sequential() 中搭建網絡結構
model = tf.keras.models.Sequential( # 全連接層
# tf.keras.layers.Dense(神經元個數,
# activation="激活函數",
# kernel_regularizer=哪種正則化)
[tf.keras.layers.Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2())] ) # 使用 compile() 配置神經網絡的訓練方法 # model.compile(optimizer=優化器, # loss=損失函數, # metrics=["評測指標"])
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]) # 在 fit() 中執行訓練過程 # model.fit(訓練集的輸入特征, 訓練集的標簽, # batch_size=, epochs=, # validation_data={測試集的輸入特征, 測試集的標簽}, # validation_split=從訓練集中划分多少比例給測試集, # validation_freq=多少次epoch測試一次 # )
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20) # 打印出網絡的結構和參數統計
model.summary()