日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

keras保存模型_TF2 8.模型保存与加载

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 keras保存模型_TF2 8.模型保存与加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

舉個例子:先訓練出一個模型

import

接下來第一種方法:只保留模型的參數:這個有2種方法:

model.save_weights("adasd.h5")model.load_weights("adasd.h5") model.predict(x_test)model.save_weights('./checkpoints/mannul_checkpoint') model.load_weights('./checkpoints/mannul_checkpoint') model.predict(x_test)

因為這種方法只保留了參數,而并沒有保留整個模型,所以說在加載的時候需要使用model.load_weights。這個函數只會保留模型的權重,它不包含模型的結構,所以當我們加載權重文件時候,需要先輸入網絡結構


再第2種方法:保留h5文件,保留整個模型

這種方法已經保存了模型的結構和權重,以及損失函數和優化器

model.save('keras_model_hdf5_version.h5')new_model = tf.keras.models.load_model('keras_model_hdf5_version.h5') new_model.predict(x_test)

注意:這種方法只可以使用在keras的順序模型和函數式模型中,不能使用在子類模型和自定義模型中,否則會報錯。


再第3種方法:保留pb文件,保留整個模型

# Export the model to a SavedModel model.save('keras_model_tf_version', save_format='tf')# Recreate the exact same model new_model = tf.keras.models.load_model('keras_model_tf_version') new_model.predict(x_test)

這個方法沒有保留優化器配置。

保留pb文件還有另一種方法:

tf.saved_model.save(model,'文件夾名')和 tf.saved_model.load('文件夾名')

注意:這里是文件夾名稱!!

當我們使用這個方法后,對應目錄下會出現一個文件夾,文件夾下有兩個子文件夾和一個子文件:assets、variables、save_model.pb

TensorFlow 為我們提供的SavedModel這一格式可在不同的平臺上部署模型文件,當模型導出為 SavedModel 文件時,無需建立。

模型的源代碼即可再次運行模型,這使得SavedModel尤其適用于模型的分享和部署。

tf.saved_model.save(model,'tf_saved_model_version') restored_saved_model = tf.saved_model.load('tf_saved_model_version') f = restored_saved_model.signatures["serving_default"]注意這里加載好了以后不能直接用predict進行預測哦。

我們這里看一下保存信息:

!saved_model_cli show --dir tf_saved_model_version --all

使用模型的命令是:

f(digits = tf.constant(x_test.tolist()) )

輸出為:

關鍵是f = restored_saved_model.signatures["serving_default"]。


最后我們看看自定義模型的保存與加載:

注意這里要用以下命令

@tf.function(input_signature=[tf.TensorSpec([None,32], tf.float32,name='digits')])

把動態圖變成靜態圖:

class MyModel(tf.keras.Model):def __init__(self, num_classes=10):super(MyModel, self).__init__(name='my_model')self.num_classes = num_classes# 定義自己需要的層self.dense_1 = tf.keras.layers.Dense(32, activation='relu')self.dense_2 = tf.keras.layers.Dense(num_classes)@tf.function(input_signature=[tf.TensorSpec([None,32], tf.float32,name='digits')])def call(self, inputs):#定義前向傳播# 使用在 (in `__init__`)定義的層x = self.dense_1(inputs)return self.dense_2(x)import numpy as np x_train = np.random.random((1000, 32)) y_train = np.random.random((1000, 10)) x_val = np.random.random((200, 32)) y_val = np.random.random((200, 10)) x_test = np.random.random((200, 32)) y_test = np.random.random((200, 10))# 優化器 optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3) # 損失函數 loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)# 準備metrics函數 train_acc_metric = tf.keras.metrics.CategoricalAccuracy() val_acc_metric = tf.keras.metrics.CategoricalAccuracy()# 準備訓練數據集 batch_size = 64 train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)) train_dataset = train_dataset.shuffle(buffer_size=1024).batch(batch_size)# 準備測試數據集 val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val)) val_dataset = val_dataset.batch(64)model = MyModel(num_classes=10) epochs = 3 for epoch in range(epochs):print('Start of epoch %d' % (epoch,))# 遍歷數據集的batch_sizefor step, (x_batch_train, y_batch_train) in enumerate(train_dataset):with tf.GradientTape() as tape:logits = model(x_batch_train)loss_value = loss_fn(y_batch_train, logits)grads = tape.gradient(loss_value, model.trainable_weights)optimizer.apply_gradients(zip(grads, model.trainable_weights))# 更新訓練集的metricstrain_acc_metric(y_batch_train, logits)# 每200 batches打印一次.if step % 200 == 0:print('Training loss (for one batch) at step %s: %s' % (step, float(loss_value)))print('Seen so far: %s samples' % ((step + 1) * 64))# 在每個epoch結束時顯示metrics。train_acc = train_acc_metric.result()print('Training acc over epoch: %s' % (float(train_acc),))# 在每個epoch結束時重置訓練指標train_acc_metric.reset_states()# 在每個epoch結束時運行一個驗證集。for x_batch_val, y_batch_val in val_dataset:val_logits = model(x_batch_val)# 更新驗證集mericsval_acc_metric(y_batch_val, val_logits)val_acc = val_acc_metric.result()val_acc_metric.reset_states()print('Validation acc: %s' % (float(val_acc),))

模型保存方法一:保存weight:

model.save_weights("adasd.h5") model.load_weights("adasd.h5") model.predict(x_test)model.save_weights('./checkpoints/mannul_checkpoint') model.load_weights('./checkpoints/mannul_checkpoint') model.predict(x_test)

模型保存方法二:保留h5,方法失敗,因為自定義模型無法保留h5:

#model.save('my_saved_model.h5')

模型保存方法三:pb格式:

model.save('path_to_my_model',save_format='tf') new_model = tf.keras.models.load_model('path_to_my_model') new_model.predict(x_test)

輸出為:

或者:

tf.saved_model.save(model,'my_saved_model') restored_saved_model = tf.saved_model.load('my_saved_model') f = restored_saved_model.signatures["serving_default"]f(digits = tf.constant(x_test.tolist()) )

!saved_model_cli show --dir my_saved_model --all

注意前面模型定義時候:

@tf.function(input_signature=[tf.TensorSpec([None,32], tf.float32,name='digits')])

這個digits,對應的就是input['digits'],也對應的是f函數中的自變量digits。


總結:

注意第2種方法h5格式只可以使用在keras的順序模型和函數式模型中,不能使用在子類模型和自定義模型中。

總結

以上是生活随笔為你收集整理的keras保存模型_TF2 8.模型保存与加载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。