Tensorflow2.1 完成权重或模型的保存和加载

目录
  • 前言
  • 实现方法
    • 1. 读取数据
    • 2. 搭建深度学习模型
    • 3. 使用回调函数在每个 epoch 后自动保存模型权重
    • 4. 使用回调函数每经过 5 个 epoch 对模型权重保存一次
    • 5. 手动保存模型权重到指定目录
    • 6. 手动保存整个模型结构和权重

前言

本文主要使用 cpu 版本的 tensorflow-2.1 来完成深度学习权重参数/模型的保存和加载操作。

在我们进行项目期间,很多时候都要在模型训练期间、训练结束之后对模型或者模型权重进行保存,然后我们可以从之前停止的地方恢复原模型效果继续进行训练或者直接投入实际使用,另外为了节省存储空间我们还可以自定义保存内容和保存频率。

实现方法

1. 读取数据

(1)本文重点介绍模型或者模型权重的保存和读取的相关操作,使用到的是 MNIST 数据集仅是为了演示效果,我们无需关心模型训练的质量好坏。

(2)这里是常规的读取数据操作,我们为了能较快介绍本文重点内容,只使用了 MNIST 前 1000 条数据,然后对数据进行归一化操作,加快模型训练收敛速度,并且将每张图片的数据从二维压缩成一维。

import os
import tensorflow as tf
from tensorflow import keras
(train_images, train_labels), (test_images, test_labels) = tf.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

2. 搭建深度学习模型

(1)这里主要是搭建一个最简单的深度学习模型。

(2)第一层将图片的长度为 784 的一维向量转换成 256 维向量的全连接操作,并且用到了 relu 激活函数。

(3)第二层紧接着使用了防止过拟合的 Dropout 操作,神经元丢弃率为 50% 。

(4)第三层为输出层,也就是输出每张图片属于对应 10 种类别的分布概率。

(5)优化器我们选择了最常见的 Adam 。

(6)损失函数选择了 SparseCategoricalCrossentropy 。

(7)评估指标选用了 SparseCategoricalAccuracy 。

def create_model():
    model = tf.keras.Sequential([keras.layers.Dense(256, activation='relu', input_shape=(784,)),
                                 keras.layers.Dropout(0.5),
                                 keras.layers.Dense(10) ])
    model.compile(optimizer='adam',
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                  metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
    return model

3. 使用回调函数在每个 epoch 后自动保存模型权重

(1)这里介绍一种在模型训练期间保存权重参数的方法,我们定义一个回调函数 callback ,它可以在训练过程中将权重保存在自定义目录中 weights_path ,在训练过程中一共执行 5 次 epoch ,每次 epoch 结束之后就会保存一次模型的权重到指定的目录。

(2)可以看到最后使用测试集进行评估的 loss 为 0.4952 ,分类准确率为 0.8500 。

weights_path = "training_weights/cp.ckpt"
weights_dir = os.path.dirname(weights_path)
callback = tf.keras.callbacks.ModelCheckpoint(filepath=weights_path, save_weights_only=True,  verbose=1)
model = create_model()
model.fit(train_images,
          train_labels,
          epochs=5,
          validation_data=(test_images, test_labels),
          callbacks=[callback])

输出结果为:

val_loss: 0.4952 - val_sparse_categorical_accuracy: 0.8500

(3)我们浏览目标文件夹里,只有三个文件,每个 epoch 后自动都会保存三个文件,在下一次 epoch 之后会自动更新这三个文件的内容。

os.listdir(weights_dir)

结果为:

['checkpoint', 'cp.ckpt.data-00000-of-00001', 'cp.ckpt.index']

(4) 我们通过 create_model 定义了一个新的模型实例,然后让其在没有训练的情况下使用测试数据进行评估,结果可想而知,准确率差的离谱。

NewModel = create_model()
loss, acc = NewModel.evaluate(test_images, test_labels, verbose=2)

结果为:

loss: 2.3694 - sparse_categorical_accuracy: 0.1330

(5) tensorflow 中只要两个模型有相同的模型结构,就可以在它们之间共享权重,所以我们使用 NewModel 读取了之前训练好的模型权重,再使用测试集对其进行评估发现,损失值和准确率和旧模型的结果完全一样,说明权重被相同结构的新模型成功加载并使用。

NewModel.load_weights(checkpoint_path)
loss, acc = NewModel.evaluate(test_images, test_labels, verbose=2)

输出结果:

loss: 0.4952 - sparse_categorical_accuracy: 0.8500

4. 使用回调函数每经过 5 个 epoch 对模型权重保存一次

(1)如果我们想保留多个中间 epoch 的模型训练的权重,或者我们想每隔几个 epoch 保存一次模型训练的权重,这时候我们可以通过设置保存频率 period 来完成,我这里让新建的模型训练 30 个 epoch ,在每经过 10 epoch 后保存一次模型训练好的权重。

(2)使用测试集对此次模型进行评估,损失值为 0.4047 ,准确率为 0.8680 。

weights_path = "training_weights2/cp-{epoch:04d}.ckpt"
weights_dir = os.path.dirname(weights_path)
batch_size = 64
cp_callback = tf.keras.callbacks.ModelCheckpoint( filepath=weights_path,
                                                  verbose=1,
                                                  save_weights_only=True,
                                                  period=10)
model = create_model()
model.save_weights(weights_path.format(epoch=1))
model.fit(train_images,
          train_labels,
          epochs=30,
          batch_size=batch_size,
          callbacks=[cp_callback],
          validation_data=(test_images, test_labels),
          verbose=1)

结果输出为:

val_loss: 0.4047 - val_sparse_categorical_accuracy: 0.8680

(3)这里我们能看到指定目录中的文件组成,这里的 0001 是因为训练时指定了要保存的 epoch 的权重,其他都是每 10 个 epoch 保存的权重参数文件。目录中有一个 checkpoint ,它是一个检查点文本文件,文件保存了一个目录下所有的模型文件列表,首行记录的是最后(最近)一次保存的模型名称。

(4)每个 epoch 保存下来的文件都包含:

  • 一个索引文件,指示哪些权重存储在哪个分片中
  • 一个或多个包含模型权重的分片

浏览文件夹内容

os.listdir(weights_dir)

结果如下:

['checkpoint', 'cp-0001.ckpt.data-00000-of-00001', 'cp-0001.ckpt.index', 'cp-0010.ckpt.data-00000-of-00001', 'cp-0010.ckpt.index', 'cp-0020.ckpt.data-00000-of-00001', 'cp-0020.ckpt.index', 'cp-0030.ckpt.data-00000-of-00001', 'cp-0030.ckpt.index']

(5)我们将最后一次保存的权重读取出来,然后创建一个新的模型去读取刚刚保存的最新的之前训练好的模型权重,然后通过测试集对新模型进行评估,发现损失值准确率和之前完全一样,说明权重被成功读取并使用。

latest = tf.train.latest_checkpoint(weights_dir)
newModel = create_model()
newModel.load_weights(latest)
loss, acc = newModel.evaluate(test_images, test_labels, verbose=2)

结果如下:

loss: 0.4047 - sparse_categorical_accuracy: 0.8680

5. 手动保存模型权重到指定目录

(1)有时候我们还想手动将模型训练好的权重保存到指定的目录下,我们可以使用 save_weights 函数,通过我们新建了一个同样的新模型,然后使用 load_weights 函数去读取权重并使用测试集对其进行评估,发现损失值和准确率仍然和之前的两种结果完全一样。

model.save_weights('./training_weights3/my_cp')
newModel = create_model()
newModel.load_weights('./training_weights3/my_cp')
loss, acc = newModel.evaluate(test_images, test_labels, verbose=2)

结果如下:

loss: 0.4047 - sparse_categorical_accuracy: 0.8680

6. 手动保存整个模型结构和权重

(1)有时候我们还需要保存整个模型的结构和权重,这时候我们直接使用 save 函数即可将这些内容保存到指定目录,使用该方法要保证目录是存在的否则会报错,所以这里我们要创建文件夹。我们能看到损失值为 0.4821,准确率为 0.8460 。

model = create_model()
model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels), verbose=1)
!mkdir my_model
modelPath = './my_model'
model.save(modelPath)

输出结果:

val_loss: 0.4821 - val_sparse_categorical_accuracy: 0.8460

(2)然后我们通过函数 load_model 即可生成出一个新的完全一样结构和权重的模型,我们使用测试集对其进行评估,发现准确率和损失值和之前完全一样,说明模型结构和权重被完全读取恢复。

new_model = tf.keras.models.load_model(modelPath)
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)

输出结果:

loss: 0.4821 - sparse_categorical_accuracy: 0.8460

以上就是Tensorflow2.1 完成权重或模型的保存和加载的详细内容,更多关于Tensorflow完成权重模型保存加载的资料请关注我们其它相关文章!

(0)

相关推荐

  • python深度学习tensorflow卷积层示例教程

    目录 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d 二.1.0版本中的卷积函数:tf.layers.conv2d 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d 在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化. conv2d( input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None ) 该函数定义在tensorflow/pytho

  • Tensorflow高性能数据优化增强工具Pipeline使用详解

    目录 安装方法 功能 高级用户部分 用例1,为训练创建数据Pipeline 用例2,为验证创建数据Pipeline 初学者部分 Keras 兼容性 配置 增强: GridMask MixUp RandomErase CutMix Mosaic CutMix , CutOut, MixUp Mosaic Grid Mask 安装方法 给大家介绍一个非常好用的TensorFlow数据pipeline工具. 高性能的Tensorflow Data Pipeline,使用SOTA的增强和底层优化. pi

  • Tensorflow 2.4加载处理图片的三种方式详解

    目录 前言 数据准备 使用内置函数读取并处理磁盘数据 自定义方式读取和处理磁盘数据 从网络上下载数据 前言 本文通过使用 cpu 版本的 tensorflow 2.4 ,介绍三种方式进行加载和预处理图片数据. 这里我们要确保 tensorflow 在 2.4 版本以上 ,python 在 3.8 版本以上,因为版本太低有些内置函数无法使用,然后要提前安装好 pillow 和 tensorflow_datasets ,方便进行后续的数据加载和处理工作. 由于本文不对模型进行质量保证,只介绍数据的加

  • Tensorflow2.4使用Tuner选择模型最佳超参详解

    目录 前言 实现过程 1. 获取 MNIST 数据并进行处理 2. 搭建超模型 3. 实例化调节器并进行模型超调 4. 训练模型获得最佳 epoch 5. 使用最有超参数集进行模型训练和评估 前言 本文使用 cpu 版本的 tensorflow 2.4 ,选用 Keras Tuner 工具以 Fashion 数据集的分类任务为例,完成最优超参数的快速选择任务. 当我们搭建完成深度学习模型结构之后,我们在训练模型的过程中,有很大一部分工作主要是通过验证集评估指标,来不断调节模型的超参数,这是比较耗

  • python深度学习tensorflow1.0参数和特征提取

    目录 tf.trainable_variables()提取训练参数 具体实例 tf.trainable_variables()提取训练参数 在tf中,参与训练的参数可用 tf.trainable_variables()提取出来,如: #取出所有参与训练的参数 params=tf.trainable_variables() print("Trainable variables:------------------------") #循环列出参数 for idx, v in enumera

  • python深度学习tensorflow训练好的模型进行图像分类

    目录 正文 随机找一张图片 读取图片进行分类识别 最后输出 正文 谷歌在大型图像数据库ImageNet上训练好了一个Inception-v3模型,这个模型我们可以直接用来进来图像分类. 下载链接: https://pan.baidu.com/s/1XGfwYer5pIEDkpM3nM6o2A 提取码: hu66 下载完解压后,得到几个文件: 其中 classify_image_graph_def.pb 文件就是训练好的Inception-v3模型. imagenet_synset_to_huma

  • python深度学习tensorflow1.0参数初始化initializer

    目录 正文 所有初始化方法定义 1.tf.constant_initializer() 2.tf.truncated_normal_initializer() 3.tf.random_normal_initializer() 4.random_uniform_initializer = RandomUniform() 5.tf.uniform_unit_scaling_initializer() 6.tf.variance_scaling_initializer() 7.tf.orthogona

  • Tensorflow2.1 完成权重或模型的保存和加载

    目录 前言 实现方法 1. 读取数据 2. 搭建深度学习模型 3. 使用回调函数在每个 epoch 后自动保存模型权重 4. 使用回调函数每经过 5 个 epoch 对模型权重保存一次 5. 手动保存模型权重到指定目录 6. 手动保存整个模型结构和权重 前言 本文主要使用 cpu 版本的 tensorflow-2.1 来完成深度学习权重参数/模型的保存和加载操作. 在我们进行项目期间,很多时候都要在模型训练期间.训练结束之后对模型或者模型权重进行保存,然后我们可以从之前停止的地方恢复原模型效果继

  • pytorch模型的保存和加载、checkpoint操作

    其实之前笔者写代码的时候用到模型的保存和加载,需要用的时候就去度娘搜一下大致代码,现在有时间就来整理下整个pytorch模型的保存和加载,开始学习把~ pytorch的模型和参数是分开的,可以分别保存或加载模型和参数.所以pytorch的保存和加载对应存在两种方式: 1. 直接保存加载模型 (1)保存和加载整个模型 # 保存模型 torch.save(model, 'model.pth\pkl\pt') #一般形式torch.save(net, PATH) # 加载模型 model = torc

  • 解决tensorflow模型参数保存和加载的问题

    终于找到bug原因!记一下:还是不熟悉平台的原因造成的! Q:为什么会出现两个模型对象在同一个文件中一起运行,当直接读取他们分开运行时训练出来的模型会出错,而且总是有一个正确,一个读取错误? 而 直接在同一个文件又训练又重新加载模型预测不出错,而且更诡异的是此时用分文件里的对象加载模型不会出错? model.py,里面含有 ModelV 和 ModelP,另外还有 modelP.py 和 modelV.py 分别只含有 ModelP 和 ModeV 这两个对象,先使用 modelP.py 和 m

  • PyTorch深度学习模型的保存和加载流程详解

    一.模型参数的保存和加载 torch.save(module.state_dict(), path):使用module.state_dict()函数获取各层已经训练好的参数和缓冲区,然后将参数和缓冲区保存到path所指定的文件存放路径(常用文件格式为.pt..pth或.pkl). torch.nn.Module.load_state_dict(state_dict):从state_dict中加载参数和缓冲区到Module及其子类中 . torch.nn.Module.state_dict()函数

  • 在Keras中实现保存和加载权重及模型结构

    1. 保存和加载模型结构 (1)保存为JSON字串 json_string = model.to_json() (2)从JSON字串重构模型 from keras.models import model_from_json model = model_from_json(json_string) (3)保存为YAML字串 yaml_string = model.to_yaml() (4)从YAML字串重构模型 model = model_from_yaml(yaml_string) 2. 保存和

  • Pytorch模型参数的保存和加载

    目录 一.前言 二.参数保存 三.参数的加载 四.保存和加载整个模型 五.总结 一.前言 在模型训练完成后,我们需要保存模型参数值用于后续的测试过程.由于保存整个模型将耗费大量的存储,故推荐的做法是只保存参数,使用时只需在建好模型的基础上加载. 通常来说,保存的对象包括网络参数值.优化器参数值.epoch值等.本文将简单介绍保存和加载模型参数的方法,同时也给出保存整个模型的方法供大家参考. 二.参数保存 在这里我们使用 torch.save() 函数保存模型参数: import torch pa

  • 基于pytorch的保存和加载模型参数的方法

    当我们花费大量的精力训练完网络,下次预测数据时不想再(有时也不必再)训练一次时,这时候torch.save(),torch.load()就要登场了. 保存和加载模型参数有两种方式: 方式一: torch.save(net.state_dict(),path): 功能:保存训练完的网络的各层参数(即weights和bias) 其中:net.state_dict()获取各层参数,path是文件存放路径(通常保存文件格式为.pt或.pth) net2.load_state_dict(torch.loa

  • keras训练浅层卷积网络并保存和加载模型实例

    这里我们使用keras定义简单的神经网络全连接层训练MNIST数据集和cifar10数据集: keras_mnist.py from sklearn.preprocessing import LabelBinarizer from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from keras.models import Sequential

  • pytorch模型的保存加载与续训练详解

    目录 前面 模型保存与加载 方式1 方式2 方式3 总结 前面 最近,看到不少小伙伴问pytorch如何保存和加载模型,其实这部分pytorch官网介绍的也是很清楚的,感兴趣的点击了解详情

  • PyTorch模型的保存与加载方法实例

    目录 模型的保存与加载 保存和加载模型参数 保存和加载模型参数与结构 总结 模型的保存与加载 首先,需要导入两个包 import torch import torchvision.models as models 保存和加载模型参数 PyTorch模型将学习到的参数存储在一个内部状态字典中,叫做state_dict.这可以通过torch.save方法来实现.我们导入预训练好的VGG16模型,并将其保存.我们将state_dict字典保存在model_weights.pth文件中. model =

随机推荐