keras接口大都實現了 _call_ 方法。
母類 _call_ 調用了 call()。
所以下面說的幾乎全部模型/網絡層 均可以在定義後,直接像函數同樣調用。
eg:segmentfault
模型對象(參數) 網絡層對象(參數)
咱們還能夠實現繼承模板緩存
from tensorflow import keras
裏面有各類度量值的接口
如:二分類、多分類交叉熵損失容器,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() # 回調函數: 以‘按指定條件提早暫停訓練’回調爲例
定義方式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:(如何分離?)code
1. 它們的分離是須要(x,y)組合在一塊兒的,若是手動實現,須要隨機打散、zip等操做。 2. 但咱們能夠經過 scikit-learn庫,的 train_test_split() 方法來實現 (2次分隔) 3. 可使用 tf.split()來手動實現
具體分離案例:參考上一篇文章: https://segmentfault.com/a/11...對象
說明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 = keras.Sequential([...]) ... model.fit() model.save_weights('weights.ckpt')
加載:
假如在另外一個文件中。(固然要把保存的權重要複製到本地目錄) model = keras.Sequential([...]) # 此模型構建必須和保存時候定義結構的如出一轍的! model.load_weights('weights.ckpt') model.evaluate(...) model.predict(...)
保存:
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(...)
保存: (使用tf.saved_model模塊)
model = keras.Sequential([...]) ... model.fit() tf.saved_model.save(model, '目錄')
加載:(使用tf.saved_model模塊)
model = tf.saved_model.load('目錄')