集团站切换校区

验证码已发送,请查收短信

复制成功
微信号:togogoi
添加微信好友, 详细了解课程
已复制成功,如果自动跳转微信失败,请前往微信添加好友
打开微信
图标

业界新闻

当前位置:首页 > >业界新闻 > >

人工智能AI培训_Tensorflow 2.0保存和加载模型

发布时间: 2019-07-12 10:02:55

人工智能AI培训_Tensorflow 2.0保存和加载模型

模型进度可以在训练期间和训练后保存。这意味着模型可以在它停止的地方继续,并避免长时间的训练。保存还意味着您可以共享您的模型,其他人可以重新创建您的工作。当发布研究模型和技术时,大多数机器学习实践者共享:

l 用于创建模型的代码

l 以及模型的训练权重或参数

共享此数据有助于其他人了解模型的工作原理,并使用新数据自行尝试。

注意:小心不受信任的代码(TensorFlow模型是代码)。有关详细信息,请参阅安全使用TensorFlow 

选项:

保存TensorFlow模型有多种方法,具体取决于你使用的API。本章节使用tf.keras(一个高级API,用于TensorFlow中构建和训练模型),有关其他方法,请参阅TensorFlow保存和还原指南保存在eager

人工智能AI培训

1. 设置

1.1. 安装和导入

需要安装和导入TensorFlow和依赖项

pip install h5py pyyaml

1.2. 获取样本数据集

我们将使用MNIST数据集来训练我们的模型以演示保存权重,要加速这些演示运行,请只使用前1000个样本数据:

from __future__ import absolute_import, division, print_function, unicode_literals
import os
import tensorflow as tf
try:
    import tensorflow.keras as keras
except:
    import tensorflow.python.keras as keras

#获取样本数据集
(train_images, train_labels), (test_images, test_labels) = keras.datasets.mnist.load_data()
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0

1.3. 定义模型

让我们构建一个简单的模型,我们将用它来演示保存和加载权重。

#定义模型
# 返回一个简短的序列模型
def create_model():
  model = tf.keras.models.Sequential([
    keras.layers.Dense(512, activation='relu', input_shape=(784,)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
  ])
  model.compile(optimizer='adam',
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])
  return model
# 创建基本模型实例
model = create_model()
print(model.summary())

 

Model: "sequential"

_________________________________________________________________

Layer (type)                 Output Shape              Param #   

=================================================================

dense (Dense)                (None, 512)               401920    

_________________________________________________________________

dropout (Dropout)            (None, 512)               0         

_________________________________________________________________

dense_1 (Dense)              (None, 10)                5130      

=================================================================

Total params: 407,050

Trainable params: 407,050

Non-trainable params: 0

_________________________________________________________________

2. 在训练期间保存检查点

主要用例是在训练期间和训练结束时自动保存检查点,通过这种方式,您可以使用训练有素的模型,而无需重新训练,或者在您离开的地方继续训练,以防止训练过程中断。

tf.keras.callbacks.ModelCheckpoint是执行此任务的回调,回调需要几个参数来配置检查点。

2.1. 检查点回调使用情况

训练模型并将其传递给 ModelCheckpoint回调

#在训练期间保存检查点
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# 创建一个检查点回调
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,
                                     save_weights_only=True,
                                     verbose=1)

model = create_model()
model.fit(train_images, train_labels,  epochs = 10,
          validation_data = (test_images,test_labels),
          callbacks = [cp_callback])  # pass callback to training

 

  Train on 1000 samples, validate on 1000 samples

  ......

  Epoch 10/10

  960/1000 [===========================>..] - ETA: 0s - loss: 0.0392 - accuracy: 1.0000

  Epoch 00010: saving model to training_1/cp.ckpt

  1000/1000 [==============================] - 0s 207us/sample - loss: 0.0393 - accuracy: 1.0000 - val_loss: 0.3976 - val_accuracy: 0.8750

 

  <tensorflow.python.keras.callbacks.History at 0x7efc3eba7358>

这将创建一个TensorFlow检查点文件集合,这些文件在每个周期结束时更新。
文件夹checkpoint_dir下的内容如下:(Linux系统使用 ls命令查看)

checkpoint  cp.ckpt.data-00000-of-00001  cp.ckpt.index

创建一个新的未经训练的模型,仅从权重恢复模型时,必须具有与原始模型具有相同体系结构的模型,由于它是相同的模型架构,我们可以共享权重,尽管它是模型的不同示例。

现在重建一个新的,未经训练的模型,并在测试集中评估它。未经训练的模型将在随机水平(10%的准确率):

model = create_model()
loss, acc = model.evaluate(test_images, test_labels)
print("Untrained model, accuracy: {:5.2f}%".format(100*acc))

 

1000/1000 [==============================] - 0s 107us/sample - loss: 2.3224 - accuracy: 0.1230

Untrained model, accuracy: 12.30%

然后从检查点加载权重,并重新评估:

model.load_weights(checkpoint_path)
loss,acc = model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

1000/1000 [==============================] - 0s 48us/sample - loss: 0.3976 - accuracy: 0.8750

Restored model, accuracy: 87.50%

2.2. 检查点选项

回调提供了几个选项,可以为生成的检查点提供唯一的名称,并调整检查点频率。

训练一个新模型,每5个周期保存一次唯一命名的检查点:

# 在文件名中包含周期数. (使用 `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,
    # 每5个周期保存一次权重
    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)

 

 

Epoch 00005: saving model to training_2/cp-0005.ckpt

......

Epoch 00050: saving model to training_2/cp-0050.ckpt

<tensorflow.python.keras.callbacks.History at 0x7efc7c3bbd30>

现在,查看生成的检查点并选择最新的检查点:

#现在,查看生成的检查点并选择最新的检查点:
latest = tf.train.latest_checkpoint(checkpoint_dir)
print(latest)

 

      'training_2/cp-0050.ckpt'

注意:默认的tensorflow格式仅保存最近的5个检查点。

要测试,请重置模型并加载最新的检查点:

model = create_model()
model.load_weights(latest)
loss, acc = model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

 

      1000/1000 [==============================] - 0s 84us/sample - loss: 0.4695 - accuracy: 0.8810

      Restored model, accuracy: 88.10%

3. 这些文件是什么?

上述代码将权重存储到检查点)格式的文件集合中,这些文件仅包含二进制格式的训练权重.检查点包含:

· 一个或多个包含模型权重的分片;

· 索引文件,指示哪些权重存储在哪个分片。

如果您只在一台机器上训练模型,那么您将有一个带有后缀的分片:.data-00000-of-00001

4. 手动保存权重

上面你看到了如何将权重加载到模型中。手动保存权重同样简单,使用Model.save_weights方法。

# 保存权重
model.save_weights('./checkpoints/my_checkpoint')
# 加载权重
model = create_model()
model.load_weights('./checkpoints/my_checkpoint')
loss,acc = model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

5. 保存整个模型

模型和优化器可以保存到包含其状态(权重和变量)和模型配置的文件中,这允许您导出模型,以便可以在不访问原始python代码的情况下使用它。由于恢复了优化器状态,您甚至可以从中断的位置恢复训练。

保存完整的模型非常有用,您可以在TensorFlow.js(HDF5, Saved Model) 中加载它们,然后在Web浏览器中训练和运行它们,或者使用TensorFlow Lite(HDF5, Saved Model)将它们转换为在移动设备上运行。

5.1. 作为HDF5文件

Keras使用HDF5标准提供基本保存格式,出于我们的目的,可以将保存的模型视为单个二进制blob

#保存整个模型
#Keras使用HDF5标准提供基本保存格式,出于我们的目的,可以将保存的模型视为单个二进制blob。
model = create_model()
model.fit(train_images, train_labels, epochs=5)
# 保存整个模型到HDF5文件 
model.save('my_model.h5')

现在从该文件重新创建模型:

# 重新创建完全相同的模型,包括权重和优化器
new_model = keras.models.load_model('my_model.h5')
print(new_model.summary())

 

Model: "sequential_6"

_________________________________________________________________

Layer (type)                 Output Shape              Param #   

=================================================================

dense_12 (Dense)             (None, 512)               401920    

_________________________________________________________________

dropout_6 (Dropout)          (None, 512)               0         

_________________________________________________________________

dense_13 (Dense)             (None, 10)                5130      

=================================================================

Total params: 407,050

Trainable params: 407,050

Non-trainable params: 0

_________________________________________________________________

检查模型的准确率:

#检查模型的准确率:
loss, acc = new_model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

1000/1000 [==============================] - 0s 94us/sample - loss: 0.4137 - accuracy: 0.8540

Restored model, accuracy: 85.40%

此方法可保存模型的所有东西:

· 权重值

· 模型的配置(架构)

· 优化器配置

Keras通过检查架构来保存模型,目前它无法保存TensorFlow优化器(来自tf.train)。使用这些时,您需要在加载后重新编译模型,否则您将失去优化程序的状态。

5.2. 作为 saved_model

注意:这种保存tf.keras模型的方法是实验性的,在将来的版本中可能会有所改变。

创建一个新的模型:

model = create_model()
model.fit(train_images, train_labels, epochs=5)

 

创建saved_model,并将其放在带时间戳的目录中:

import time
saved_model_path = "./saved_models/{}".format(int(time.time()))
tf.keras.experimental.export_saved_model(model, saved_model_path)
print(saved_model_path)

 

    './saved_models/1555630614'

从保存的模型重新加载新的keras模型:

new_model = tf.keras.experimental.load_from_saved_model(saved_model_path)
print(new_model.summary())

 

Model: "sequential_7"

_________________________________________________________________

Layer (type)                 Output Shape              Param #   

=================================================================

dense_14 (Dense)             (None, 512)               401920    

_________________________________________________________________

dropout_7 (Dropout)          (None, 512)               0         

_________________________________________________________________

dense_15 (Dense)             (None, 10)                5130      

=================================================================

Total params: 407,050

Trainable params: 407,050

Non-trainable params: 0

_________________________________________________________________

运行加载的模型进行预测:

model.predict(test_images).shape

 

 (1000, 10)

new_model.compile(optimizer=model.optimizer,  # keep the optimizer that was loaded
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
# 评估加载后的模型
loss, acc = new_model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

      1000/1000 [==============================] - 0s 102us/sample - loss: 0.4367 - accuracy: 0.8570

      Restored model, accuracy: 85.70%

 

本实验利用网上已有的北京房价数据集预测了北京的房价,实现了TensorFlow的线性回归应用。

上一篇: Python培训_使用虚拟环境安装Django

下一篇: 大数据培训_朴素贝叶斯分类

在线咨询 ×

您好,请问有什么可以帮您?我们将竭诚提供最优质服务!