AI => Tensorflow2.0語法 - keras_API的使用(三)

前言

keras接口大都實現了 _call_ 方法。
母類 _call_ 調用了 call()。
所以下面說的幾乎全部模型/網絡層 均可以在定義後,直接像函數同樣調用。
eg:segmentfault

模型對象(參數) 
網絡層對象(參數)

咱們還能夠實現繼承模板緩存

導入

from tensorflow import keras

metrics (統計平均)

裏面有各類度量值的接口
如:二分類、多分類交叉熵損失容器,MSE、MAE的損失值容器, Accuracy精確率容器等。
下面以Accuracy僞碼爲例:網絡

acc_meter = keras.metrics.Accuracy() # 創建一個容器
for _ in epoches:
    for _ in batches:
        y = ...
        y_predict = ...
        acc_meter.update_state(y, y_predict) # 每次扔進去數據,容器都會自動計算accuracy,並儲存
    
        if times % 100 == 0: # 一百次一輸出, 設置一個閾值/閥門
            print(acc_meter.result().numpy())   # 取出容器內全部儲存的數據的,均值準確率
    acc_meter。reset_states()    # 容器緩存清空, 下一epoch從頭計數。

激活函數+損失函數+優化器

導入方式:函數

keras.activations.relu()    # 激活函數:以relu爲例,還有不少
keras.losses.categorical_crossentropy() # 損失函數:以交叉熵爲例,還有不少
keras.optimizers.SGD()      # 優化器:以隨機梯度降低優化器爲例
keras.callbacks.EarlyStopping()  # 回調函數: 以‘按指定條件提早暫停訓練’回調爲例

Sequential(繼承自Model)屬於模型

模型定義方式

定義方式1:測試

model = keras.models.Sequential( [首層網絡,第二層網絡。。。] )

定義方式1:優化

model = keras.models.Sequential()
model.add(首層網絡)
model.add(第二層網絡)

模型相關回調配置

logdir = 'callbacks'
if not os.path.exists(logdir):
    os.mkdir(logdir)
save_model_file = os.path.join(logdir, 'mymodel.h5')

callbacks = [
    keras.callbacks.TensorBoard(logdir),    # 寫入tensorboard
    keras.callbacks.ModelCheckpoint(output_model_file, save_best_only=True),  # 模型保存
    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)  # 按條件終止模型訓練
    # 驗證集,每次都會提高,若是提高不動了,提高小於這個min_delta閾值,則會耐心等待5次。
    # 5次事後,要是還提高這麼點。就提早結束。
]
# 代碼寫在這裏,如何傳遞調用, 下面 「模型相關量度配置」 會提到

模型相關量度配置:((損失,優化器,準確率等)

說明,下面的各類量度屬性,可經過字符串方式,也可經過上面講的導入實例化對象方式。lua

model.compile(
    loss="sparse_categorical_crossentropy",    # 損失函數,這是字符串方式
    optimizer= keras.optimizers.SGD()          # 這是實例化對象的方式,這種方式能夠傳參
    metrics=['accuracy']  # 這項會在fit()時打印出來
)  # compile() 操做,沒有真正的訓練。
model.fit(
    x,y,
    epochs=10,                              # 反覆訓練 10 輪
    validation_data = (x_valid,y_valid),    # 把劃分好的驗證集放進來(fit時打印loss和val)
    validation_freq = 5,                    # 訓練5次,驗證一次。  可不傳,默認爲1。
    callbacks=callbacks,                    # 指定回調函數, 請銜接上面‘模型相關回調配置’
    
)   # fit()纔是真正的訓練

模型 驗證&測試

通常咱們會把 數據先分紅三部分(若是用相同的數據,起不到測試和驗證效果,參考考試做弊思想):spa

  1. 訓練集: (大批量,主體)
  2. 測試集: (模型全部訓練結束後, 纔用到)
  3. 驗證集: (訓練的過程種就用到)

說明1:(如何分離?)code

1. 它們的分離是須要(x,y)組合在一塊兒的,若是手動實現,須要隨機打散、zip等操做。
2. 但咱們能夠經過 scikit-learn庫,的 train_test_split() 方法來實現 (2次分隔)
3. 可使用 tf.split()來手動實現

具體分離案例:參考上一篇文章: https://segmentfault.com/a/11...對象

說明2:(爲何咱們有了測試集,還須要驗證集?)

  1. 測試集是用來在最終,模型訓練成型後(參數固定),進行測試,而且返回的是預測的結果值!!!!
  2. 驗證集是伴隨着模型訓練過程當中而驗證)

代碼以下:

loss, accuracy = model.evaluate( (x_test, y_test) ) # 度量, 注意,返回的是精度指標等
target = model.predict( (x_test, y_test) )          # 測試, 注意,返回的是 預測的結果!

可用參數

model.trainable_variables    # 返回模型中全部可訓練的變量
# 使用場景: 就像咱們以前說過的 gradient 中用到的 zip(求導結果, model.trainable_variables)

自定義Model

Model至關於母版, 你繼承了它,並實現對應方法,一樣也能簡便實現模型的定義。

自定義Layer

同Model, Layer也至關於母版, 你繼承了它,並實現對應方法,一樣也能簡便實現網絡層的定義。

模型保存與加載

方法1:以前callback說的

方法2:只保存weight(模型不徹底一致)

保存:

model = keras.Sequential([...])
...
model.fit()
model.save_weights('weights.ckpt')

加載:

假如在另外一個文件中。(固然要把保存的權重要複製到本地目錄)
model = keras.Sequential([...])    # 此模型構建必須和保存時候定義結構的如出一轍的!
model.load_weights('weights.ckpt')
model.evaluate(...)
model.predict(...)

方法3:保存整個模型(模型徹底一致)

保存:

model = keras.Sequential([...])
...
model.fit()
model.save('model.h5')    # 注意 這裏變了,是 save

加載:(直接加載便可,不須要從新復原建模過程)

假如在另外一個文件中。(固然要把保存的模型要複製到本地目錄)
model = keras.models.load_model('model.h5')  # load_model是在 keras.models下
model.evaluate(...)
model.predict(...)

方法4:導出可供其餘語言使用(工業化)

保存: (使用tf.saved_model模塊)

model = keras.Sequential([...])
...
model.fit()
tf.saved_model.save(model, '目錄')

加載:(使用tf.saved_model模塊)

model = tf.saved_model.load('目錄')
相關文章
相關標籤/搜索