Tensorflow: как сохранить / восстановить модель?

Это потому, что декораторы являются «синтаксическим сахаром». Скажем, у вас есть следующий декоратор:

def MyDecorator(func):
    def transformed(*args):
        print "Calling func " + func.__name__
        func()
    return transformed

И вы применяете его к функции:

@MyDecorator
def thisFunction():
    print "Hello!"

Это эквивалентно:

thisFunction = MyDecorator(thisFunction)

Вы могли бы встроить «историю» в объект функции, возможно, если вы контролируете декораторов. Бьюсь об заклад, есть еще один умный способ сделать это (возможно, переопределив назначение), но я не настолько хорошо разбираюсь в Python, к сожалению. : (

486
задан corning 24 March 2018 в 15:38
поделиться

4 ответа

В новой версии 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)
0
ответ дан 22 November 2019 в 22:33
поделиться

После ответа @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"})
0
ответ дан 22 November 2019 в 22:33
поделиться

Модель tf.keras, сохраняющая с 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))

Сохраняющая и загружающаяся модель Weights только [1 112]

, Если Вы интересуетесь сохранением весов модели только и затем загружаете веса для восстановления модели, затем

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 модель. Однако существует много других путей. Прокомментируйте ниже, если Вы видите, что Ваш вариант использования не покрыт выше.Спасибо!

2
ответ дан 22 November 2019 в 22:33
поделиться

Для tensorflow-2.0

это очень просто.

import tensorflow as tf

СОХРАНЯЮТ

model.save("model_name")

ВОССТАНОВЛЕНИЕ

model = tf.keras.models.load_model('model_name')
0
ответ дан 22 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: