1. tf.keras.models.Sequential([網(wǎng)絡(luò)結(jié)構(gòu)]) # 描述各層網(wǎng)絡(luò)
Sequentail()可以認(rèn)為是個(gè)容器,這個(gè)容器里封裝了一個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。在Sequential中要描述從輸入層到輸出層每一層的網(wǎng)絡(luò)結(jié)構(gòu)。
每一層的網(wǎng)絡(luò)結(jié)構(gòu)可以是
- 拉直層: tf.keras.layers.Flatten() ,這一層不含計(jì)算,只是形狀轉(zhuǎn)換,把輸入特征拉直,變成一維數(shù)組
-
全連接層: tf.keras.layers.Dense(神經(jīng)元個(gè)數(shù),activation=“激活函數(shù)”,kernel_regularizer=哪種正則化), 這一層告知神經(jīng)元個(gè)數(shù)、使用什么激活函數(shù)、采用什么正則化方法
- 激活函數(shù)可以選擇relu, softmax, sigmoid, tanh等
- 正則化可以選擇 tf.keras.regularizers.l1(), tf.keras.relularizers.l2()
- 卷積神經(jīng)網(wǎng)絡(luò)層:tf.keras.layers.Conv2D(filters=卷積核個(gè)數(shù), kernel_size=卷積核尺寸, strides=卷積步長, padding="valid" or "same")
- 循環(huán)神經(jīng)網(wǎng)絡(luò)層:tf.keras.layers.LSTM()
2. model.compile(optimizer=優(yōu)化器,loss=損失函數(shù),metrics=["準(zhǔn)確率"])
在這里告知訓(xùn)練時(shí)選擇的優(yōu)化器、損失函數(shù)、和評測指標(biāo)。
這些參數(shù)都可以使用字符串形式或函數(shù)形式
-
optimizer: 引導(dǎo)神經(jīng)網(wǎng)絡(luò)更新參數(shù)
- sgd or tf.keras.optimizer.SGD(lr=學(xué)習(xí)率,momentum=動(dòng)量參數(shù))
- adagrad or tf.keras.optimizer.Adagrad(lr=學(xué)習(xí)率)
- adadelta or tf.keras.optimizer.Adadelta(lr=學(xué)習(xí)率)
- adam or tf.keras.optimizer.Adam(lr=學(xué)習(xí)率, beta_1=0.9, beta_2=0.999)
-
loss: 損失函數(shù)
- mes or tf.keras.losses.MeanSquaredError()
- sparse_categorical_crossentropy or tf.keras.SparseCategoricalCrossentropy(from_logits=False)(是原始輸出還是經(jīng)過概率分布)
-
metrics:評測指標(biāo)
- accuracy:y_ 和 y 都是數(shù)值,如y_=[1] y=[1]
- categorical_accuracy: y_和y都是獨(dú)熱碼(概率分布),如y_=[0, 1, 0], y=[0.256, 0.695, 0.048]
- sparse_categorical_accuracy: y_是數(shù)值,y是獨(dú)熱碼(概率分布),如y_=[1], y=[0.256, 0.695, 0.048]
3. model.fit(訓(xùn)練集的輸入特征,訓(xùn)練集的標(biāo)簽,batch_size= 每次喂入神經(jīng)網(wǎng)絡(luò)的樣本數(shù), epochs=迭代多少次數(shù)據(jù)集, validation_data=(測試集的輸入特征,測試集的標(biāo)簽,), validation_split=從訓(xùn)練集劃分多少比例給測試集,validation_freq=多少次epoch測試一次)
4. model.summary()
打印出網(wǎng)絡(luò)的結(jié)構(gòu)和參數(shù)統(tǒng)計(jì)
5. 示例:鳶尾花分類
import tensorflow as tf
from sklearn import datasets
import numpy as np
# 載入數(shù)據(jù)(訓(xùn)練集和測試集在訓(xùn)練時(shí)按比例劃分,此處暫無劃分)
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
# 用相同的隨機(jī)種子讓特征集和標(biāo)簽集亂序并一一對應(yīng)
np.random.seed(123)
np.random.shuffle(x_train)
np.random.seed(123)
np.random.shuffle(y_train)
# 搭建神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):3個(gè)神經(jīng)元的全連接層,采用softmax激活函數(shù),
# l2正則化防治過擬合
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation='softmax',
kernel_regularizer=tf.keras.regularizers.l2())
])
"""
# class寫法
from tensorflow.keras import Model
from tensorflow.keras.layers import Dense
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()
"""
# 配置訓(xùn)練方法:采用SGD優(yōu)化器,SparseCategoricalCrossentropy損失函數(shù)(由于采
# 用了softmax作為激活函數(shù),輸出的是概率而不是原始分布,所以from_logits
# 為False), sparse_categorical_accuracy作為評測指標(biāo)(由于鳶尾花標(biāo)簽
# 為[0, 1, 2], 而網(wǎng)絡(luò)結(jié)構(gòu)輸出的為概率分布)
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=["sparse_categorical_accuracy"])
# 訓(xùn)練模型:將20%的數(shù)據(jù)用于測試,每次喂入32組數(shù)據(jù),數(shù)據(jù)集循環(huán)
# 迭代500次,每迭代20次訓(xùn)練集要在測試集中驗(yàn)證一次準(zhǔn)確率
model.fit(x_train, y_train, batch_size=32, epochs=500,
validation_split=0.2, validation_freq=20)
# 打印出網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)統(tǒng)計(jì)
model.summary()
運(yùn)行結(jié)果:
Epoch 498/500
4/4 [==============================] - 0s 0s/step - loss: 0.3155 - sparse_categorical_accuracy: 0.9833
Epoch 499/500
1/4 [======>.......................] - ETA: 0s - loss: 0.2978 - sparse_categorical_accuracy: 1.0000
4/4 [==============================] - 0s 2ms/step - loss: 0.3251 - sparse_categorical_accuracy: 0.9750
Epoch 500/500
1/4 [======>.......................] - ETA: 0s - loss: 0.3148 - sparse_categorical_accuracy: 0.9688
4/4 [==============================] - 0s 10ms/step - loss: 0.3210 - sparse_categorical_accuracy: 0.9833 - val_loss: 0.4276 - val_sparse_categorical_accuracy: 0.9000
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) multiple 15
=================================================================
Total params: 15
Trainable params: 15
Non-trainable params: 0
_________________________________________________________________