文章目錄
- Keras 模型
- Sequential 順序模型
- Sequential 使用方法
- Model 模型
- Model 使用方法
Keras 模型
Keras提供的模型,其中分為兩類:
- Sequential 順序模型
- Model 類模型(使用函式式 API 的 Model 類模型)
我們可以通過from tensorflow.keras import Sequential或者 from tensorflow.keras import Sequential來匯入對應的模型,
Sequential 順序模型
官方原檔案:https://tensorflow.google.cn/api_docs/python/tf/keras/Sequential?hl=zh-cn
Sequential 模型結構: 層(layers)的線性堆疊,簡單來說,它是一個簡單的線性結構,沒有多余分支,是多個網路層的堆疊,
函式原型:
tf.keras.Sequential(
layers=None, name=None
)
Sequential 使用方法
一個簡單示例
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax')
])
- 其中,Dense是一個全連接層,它的激活函式默認為是linear線性函式
- 激活函式可以通過 單獨的激活層 實作,也可以通過 構建層時傳遞activation實作,這就是說:
上面的代碼等價于
model = Sequential([
Dense(32, input_shape=(784,), activation='relu'),
Dense(10, activation='softmax')
])
構建方法
除了上面寫到的:
model = Sequential([
Dense(32, input_shape=(784,), activation='relu'),
Dense(10, activation='softmax')
])
還可以寫成:
model = Sequential()
model.add(Dense(32, input_shape=(784,), activation='relu'))
model.add(Dense(10, activation='softmax'))
input_shape 輸入的形狀
構建一個模型時,第一層需要給出期待的Input shape ,剩余的層次會自動判斷,
input_shape是一個tuple格式的資料,可以是整數的tuple,也可以是Noneinput_shape中并沒有batch dimension批量維度- 2D層,例如Dense, 可以通過指定引數
input_dim(一個數字)來描述輸入形狀, - 3D層,通過引數
input_dim和input_length來描述輸入型狀, - 引數
input_shape通過tuple的形式,指定輸入形狀, - 引數
batch_size可以指定固定批量大小,
model = Sequential()
model.add(Dense(32, input_dim=784))
等價于:
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
compile編譯
在訓練模型之前,我們需要通過compile來對學習程序進行配置,compile接收三個引數:
- 優化器optimizer: 該引數可指定為已預定義的優化器名,如
rmsprop(默認)、adagrad,或一個Optimizer類的物件,詳情見 待補充 - 損失函式loss: 該引數為模型試圖最小化的目標函式,它可為預定義的損失函式名,如
categorical_crossentropy、mse,也可以為一個損失函式,詳情見 待補充 - 指標串列metrics: 對分類問題,我們一般將該串列設定為
metrics=['accuracy'],指標可以是一個預定義指標的名字,也可以是一個用戶定制的函式.指標函式應該回傳單個張量,或一個完成metric_name - > metric_value映射的字典.請參考 待補充
# 對于多分類問題
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 對于二元分類問題
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 對于均方誤差回歸問題
model.compile(optimizer='rmsprop',
loss='mse')
# 自定義指標
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
訓練
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 生成資料
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)
函式原型:
fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None,validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,sample_weight=None, initial_epoch=0, steps_per_epoch=None,validation_steps=None, validation_batch_size=None, validation_freq=1,max_queue_size=10, workers=1, use_multiprocessing=False)
其中常用的引數:
- x: Numpy訓練資料陣列(如果模型有單個輸入),或Numpy陣列串列(如果模型有多個輸入),也可以是已經命名的輸入圖層的名稱, 如果從框架原生張量(例如TensorFlow資料張量)進行饋送,則x可以是None(默認),
- y: 與x相似,只不過y代表的是目標標簽(target label),可以是:Numpy目標(標簽)資料陣列(如果模型具有單個輸出)或Numpy陣列串列(如果模型具有多個輸出)或 輸入圖層的名稱 或None.
- batch_size:
Integer或None,代表每個梯度更新的樣本數,默認值為32, - epochs:
Integer,模型的訓練的 時期數,每個epoch是對x,y的整個迭代,
Model 模型
官方原檔案:https://tensorflow.google.cn/api_docs/python/tf/keras/Model?hl=zh-cn
Model 模型是帶有函式API的,不是線性的,它是一個可以多輸入、多輸出的模型,
model = Model(inputs=a, outputs=b)
model = Model(inputs=[a1, a2], outputs=[b1, b2, b3])
- 通過inputs 和 outputs 構造多輸入(a1,a2)和多輸出(b1,b2,b3)的Model
Model 使用方法
與Sequential類似,有compile fit等方法,大致和上述的compile和fit一致,
compile 編譯
函式原型:
compile(
optimizer='rmsprop', loss=None, metrics=None, loss_weights=None,
weighted_metrics=None, run_eagerly=None, steps_per_execution=None, **kwargs
)
- 優化器optimizer: 該引數可指定為已預定義的優化器名,如rmsprop(默認)、adagrad,或一個Optimizer類的物件,詳情見 待補充
- 損失函式oss: 與Sequential的compile的loss有所不同的是,Model的多個輸出可以有多個
loss,可以用過一個dict來宣告:{'output_a':loss_func_1, 'output_b':loss_func_2} - 指標串列metrics: 對分類問題,我們一般將該串列設定為metrics=[‘accuracy’],指標可以是一個預定義指標的名字,也可以是一個用戶定制的函式.指標函式應該回傳單個張量,或一個完成metric_name - > metric_value映射的字典.請參考 待補充
fit 訓練
函式原型:
fit(
x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None,
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,
sample_weight=None, initial_epoch=0, steps_per_epoch=None,
validation_steps=None, validation_batch_size=None, validation_freq=1,
max_queue_size=10, workers=1, use_multiprocessing=False
)
常用引數:
- x:輸入資料,如果模型只有一個輸入,那么x的型別是numpy array,如果模型有多個輸入,那么x的型別應當為list,list的元素是對應于各個輸入的numpy array,如果模型的每個輸入都有名字,則可以傳入一個字典,將輸入名與其輸入資料對應起來,
- y:標簽,numpy array,如果模型有多個輸出,可以傳入一個numpy array的list,如果模型的輸出擁有名字,則可以傳入一個字典,將輸出名與其標簽對應起來,
- batch_size:整數,指定進行梯度下降時每個batch包含的樣本數,訓練時一個batch的樣本會被計算一次梯度下降,使目標函式優化一步,
- epoch:整數,訓練的輪數,訓練資料將會被遍歷epoch次,
Model實體
from keras.layers import Input, Dense
from keras.models import Model
# 定義輸入層,確定輸入維度
input = input(shape = (784, ))
# 2個隱含層,每個都有64個神經元,使用relu激活函式,且由上一層作為引數
x = Dense(64, activation='relu')(input)
x = Dense(64, activation='relu')(x)
# 輸出層
y = Dense(10, activation='softmax')(x)
# 定義模型,指定輸入輸出
model = Model(input=input, output=y)
# 編譯模型,指定優化器,損失函式,度量
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
# 模型擬合,即訓練
model.fit(data, labels)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277464.html
標籤:AI
