Это потому, что декораторы являются «синтаксическим сахаром». Скажем, у вас есть следующий декоратор:
def MyDecorator(func):
def transformed(*args):
print "Calling func " + func.__name__
func()
return transformed
И вы применяете его к функции:
@MyDecorator
def thisFunction():
print "Hello!"
Это эквивалентно:
thisFunction = MyDecorator(thisFunction)
Вы могли бы встроить «историю» в объект функции, возможно, если вы контролируете декораторов. Бьюсь об заклад, есть еще один умный способ сделать это (возможно, переопределив назначение), но я не настолько хорошо разбираюсь в Python, к сожалению. : (
В новой версии tensorflow 2.0 процесс сохранения/загрузки модели намного легче. Из-за Реализации API Keras, высокоуровневого API для TensorFlow.
Для сохранения модели: Проверьте документацию на ссылку: https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/models/save_model
tf.keras.models.save_model(model_name, filepath, save_format)
Для загрузки модели:
https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/models/load_model
model = tf.keras.models.load_model(filepath)
После ответа @Vishnuvardhan Janapati вот другой способ сохранить и перезагрузить модель с пользовательский уровень/метрика/потеря под TensorFlow 2.0.0
import tensorflow as tf
from tensorflow.keras.layers import Layer
from tensorflow.keras.utils.generic_utils import get_custom_objects
# custom loss (for example)
def custom_loss(y_true,y_pred):
return tf.reduce_mean(y_true - y_pred)
get_custom_objects().update({'custom_loss': custom_loss})
# custom loss (for example)
class CustomLayer(Layer):
def __init__(self, ...):
...
# define custom layer and all necessary custom operations inside custom layer
get_custom_objects().update({'CustomLayer': CustomLayer})
Таким образом, после того как Вы выполнили такие коды и сохранили Вашу модель с tf.keras.models.save_model
или model.save
или ModelCheckpoint
обратный вызов, можно перезагрузить модель без потребности точных пользовательских объектов, столь же простых как
new_model = tf.keras.models.load_model("./model.h5"})
TF2.0
, я вижу большие ответы для сохранения моделей с помощью TF1.x. Я хочу обеспечить еще несколько указателей в сохранении tensorflow.keras
модели, который является немного сложным, поскольку существует много способов сохранить модель.
Здесь я обеспечиваю пример сохранения tensorflow.keras
модель к model_path
папка под текущим каталогом. Это работает хорошо с новым tensorflow (TF2.0). Я обновлю это описание, если будет какое-либо изменение в ближайшем будущем.
import tensorflow as tf
from tensorflow import keras
mnist = tf.keras.datasets.mnist
#import data
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# create a model
def create_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
# compile the model
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
# Create a basic model instance
model=create_model()
model.fit(x_train, y_train, epochs=1)
loss, acc = model.evaluate(x_test, y_test,verbose=1)
print("Original model, accuracy: {:5.2f}%".format(100*acc))
# Save entire model to a HDF5 file
model.save('./model_path/my_model.h5')
# Recreate the exact same model, including weights and optimizer.
new_model = keras.models.load_model('./model_path/my_model.h5')
loss, acc = new_model.evaluate(x_test, y_test)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
, Если Вы интересуетесь сохранением весов модели только и затем загружаете веса для восстановления модели, затем
model.fit(x_train, y_train, epochs=5)
loss, acc = model.evaluate(x_test, y_test,verbose=1)
print("Original model, accuracy: {:5.2f}%".format(100*acc))
# Save the weights
model.save_weights('./checkpoints/my_checkpoint')
# Restore the weights
model = create_model()
model.load_weights('./checkpoints/my_checkpoint')
loss,acc = model.evaluate(x_test, y_test)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
# include the epoch in the file name. (uses `str.format`)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(
checkpoint_path, verbose=1, save_weights_only=True,
# Save weights, every 5-epochs.
period=5)
model = create_model()
model.save_weights(checkpoint_path.format(epoch=0))
model.fit(train_images, train_labels,
epochs = 50, callbacks = [cp_callback],
validation_data = (test_images,test_labels),
verbose=0)
latest = tf.train.latest_checkpoint(checkpoint_dir)
new_model = create_model()
new_model.load_weights(latest)
loss, acc = new_model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
import tensorflow as tf
from tensorflow import keras
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# Custom Loss1 (for example)
@tf.function()
def customLoss1(yTrue,yPred):
return tf.reduce_mean(yTrue-yPred)
# Custom Loss2 (for example)
@tf.function()
def customLoss2(yTrue, yPred):
return tf.reduce_mean(tf.square(tf.subtract(yTrue,yPred)))
def create_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy', customLoss1, customLoss2])
return model
# Create a basic model instance
model=create_model()
# Fit and evaluate model
model.fit(x_train, y_train, epochs=1)
loss, acc,loss1, loss2 = model.evaluate(x_test, y_test,verbose=1)
print("Original model, accuracy: {:5.2f}%".format(100*acc))
model.save("./model.h5")
new_model=tf.keras.models.load_model("./model.h5",custom_objects={'customLoss1':customLoss1,'customLoss2':customLoss2})
, Когда у нас есть пользовательская операция в секунду как в следующем случае (tf.tile
), мы должны создать функцию и перенестись с уровнем Lambda. Иначе модель не может быть сохранена.
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Input, Lambda
from tensorflow.keras import Model
def my_fun(a):
out = tf.tile(a, (1, tf.shape(a)[0]))
return out
a = Input(shape=(10,))
#out = tf.tile(a, (1, tf.shape(a)[0]))
out = Lambda(lambda x : my_fun(x))(a)
model = Model(a, out)
x = np.zeros((50,10), dtype=np.float32)
print(model(x).numpy())
model.save('my_model.h5')
#load the model
new_model=tf.keras.models.load_model("my_model.h5")
я думаю, что покрыл несколько из многих способов сохранить tf.keras модель. Однако существует много других путей. Прокомментируйте ниже, если Вы видите, что Ваш вариант использования не покрыт выше.Спасибо!
Для tensorflow-2.0
это очень просто.
import tensorflow as tf
model.save("model_name")
model = tf.keras.models.load_model('model_name')