Tensorflow-变量保存与导入

本文介绍了如何在TensorFlow中保存和加载模型变量,详细解释了不同场景下的操作方法,如仅保存特定变量、从检查点文件恢复变量及结合variable_scope进行变量管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:


1、基本用法

#!/usr/bin/python3
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
# import glob
import numpy as np


logdir='./output/'

with tf.variable_scope('conv'):
    w=tf.get_variable('w',[2,2],tf.float32,initializer=tf.random_normal_initializer)
    b=tf.get_variable('b',[2],tf.float32,initializer=tf.random_normal_initializer)
sess=tf.InteractiveSession()
saver=tf.train.Saver([w]) # 参数为空,默认保存所有变量,此处只保存变量w
tf.global_variables_initializer().run() # 初始化所有变量

# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(logdir)
if ckpt and ckpt.model_checkpoint_path:
    saver.restore(sess, ckpt.model_checkpoint_path)
tf.variables_initializer([b]) # 初始化变量b

saver.save(sess,logdir+'model.ckpt')
print('w',w.eval())
print('-----------')
print('b',b.eval())
sess.close()

2、变量从ckpt中提取,没有的需初始化

  • 第一运行
#!/usr/bin/python3
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
# import glob
import numpy as np
from tensorflow.contrib.layers.python.layers import batch_norm
import argparse

logdir='./output/'

with tf.variable_scope('conv'):
    w1=tf.get_variable('w',[2,2],tf.float32,initializer=tf.random_normal_initializer)
    b1=tf.get_variable('b',[2],tf.float32,initializer=tf.random_normal_initializer)
# with tf.variable_scope('conv2'):
#     w2=tf.get_variable('w',[1,2],tf.float32,initializer=tf.random_normal_initializer)
#     b2=tf.get_variable('b',[1],tf.float32,initializer=tf.random_normal_initializer)

sess=tf.InteractiveSession()
tf.global_variables_initializer().run() # 初始化所有变量

# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(logdir)
if ckpt and ckpt.model_checkpoint_path:
    try:
        saver = tf.train.Saver()  # 参数为空,默认保存所有变量,这里只有变量w1、b1
        saver.restore(sess, ckpt.model_checkpoint_path)
        saver=None
    except:
        saver = tf.train.Saver([w1,b1])  # 参数为空,默认保存所有变量,这里只有变量w1、b1
        saver.restore(sess, ckpt.model_checkpoint_path)
        saver = None
# tf.variables_initializer([b1]) # 初始化变量b

saver=tf.train.Saver() # 参数为空,默认保存所有变量,这里只有变量w1、b1
saver.save(sess,logdir+'model.ckpt')
print('w',w1.eval())
print('-----------')
print('b',b1.eval())
print('-----------')
# print('w',w2.eval())
# print('-----------')
# print('b',b2.eval())

sess.close()

这里写图片描述

  • 第二次运行
#!/usr/bin/python3
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
# import glob
import numpy as np
from tensorflow.contrib.layers.python.layers import batch_norm
import argparse

logdir='./output/'

with tf.variable_scope('conv'):
    w1=tf.get_variable('w',[2,2],tf.float32,initializer=tf.random_normal_initializer)
    b1=tf.get_variable('b',[2],tf.float32,initializer=tf.random_normal_initializer)
with tf.variable_scope('conv2'):
    w2=tf.get_variable('w',[1,2],tf.float32,initializer=tf.random_normal_initializer)
    b2=tf.get_variable('b',[1],tf.float32,initializer=tf.random_normal_initializer)

sess=tf.InteractiveSession()

tf.global_variables_initializer().run() # 初始化所有变量

# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(logdir)
if ckpt and ckpt.model_checkpoint_path:
    try:
        saver = tf.train.Saver()  # 参数为空,默认提取所有变量,
        saver.restore(sess, ckpt.model_checkpoint_path)
        saver = None
    except:
        saver = tf.train.Saver([w1, b1])  # 参数为空,默认提取所有变量,
        # 此处提取变量w1、b1(因为上步保存的变量没有w2,b2,如果使用saver = tf.train.Saver()会报错)
        saver.restore(sess, ckpt.model_checkpoint_path)
        saver=None
# tf.variables_initializer([b1]) # 初始化变量b

saver=tf.train.Saver() # 参数为空,默认保存所有变量,此处只保存所有变量,包括w2,b2
saver.save(sess,logdir+'model.ckpt')
print('w',w1.eval())
print('-----------')
print('b',b1.eval())
print('-----------')
print('w',w2.eval())
print('-----------')
print('b',b2.eval())

sess.close()

这里写图片描述

  • 第3次运行
#!/usr/bin/python3
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
# import glob
import numpy as np
from tensorflow.contrib.layers.python.layers import batch_norm
import argparse

logdir='./output/'

with tf.variable_scope('conv'):
    w1=tf.get_variable('w',[2,2],tf.float32,initializer=tf.random_normal_initializer)
    b1=tf.get_variable('b',[2],tf.float32,initializer=tf.random_normal_initializer)
with tf.variable_scope('conv2'):
    w2=tf.get_variable('w',[1,2],tf.float32,initializer=tf.random_normal_initializer)
    b2=tf.get_variable('b',[1],tf.float32,initializer=tf.random_normal_initializer)

sess=tf.InteractiveSession()

tf.global_variables_initializer().run() # 初始化所有变量

# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(logdir)
if ckpt and ckpt.model_checkpoint_path:
    # try:
    #     saver = tf.train.Saver()  # 参数为空,默认提取所有变量,
    #     saver.restore(sess, ckpt.model_checkpoint_path)
    #     saver = None
    # except:
    saver = tf.train.Saver([w1, b1])  # 上一步保存的变量有w1,b1,w2,b2,这里只提取w1,b1
    saver.restore(sess, ckpt.model_checkpoint_path)
    saver=None
# tf.variables_initializer([w2,b2]) # 初始化变量w2,b2

saver=tf.train.Saver() # 参数为空,默认保存所有变量,此处只保存所有变量,包括w2,b2
saver.save(sess,logdir+'model.ckpt')
print('w',w1.eval())
print('-----------')
print('b',b1.eval())
print('-----------')
print('w',w2.eval())
print('-----------')
print('b',b2.eval())

sess.close()

这里写图片描述

3、总结

  • 保存变量
tf.global_variables_initializer().run() # 初始化所有变量
saver=tf.train.Saver() # 参数为空,默认保存所有变量
saver=tf.train.Saver([w,b]) # 保存部分变量
saver.save(sess,logdir+'model.ckpt')
  • 导入变量
tf.global_variables_initializer().run() # 初始化所有变量

# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(logdir)
if ckpt and ckpt.model_checkpoint_path:
    try:
        saver = tf.train.Saver()  # 参数为空,默认导入所有变量,
        saver.restore(sess, ckpt.model_checkpoint_path)
        saver = None
    except:
        saver = tf.train.Saver([w1, b1])  # 导入部分变量
        saver.restore(sess, ckpt.model_checkpoint_path)
        saver=None

如果保存的变量有w1,b1,w2,b2,但只导入w1,b1,对w2,b2重新初始化,训练等 使用

saver = tf.train.Saver([w1, b1])

如果保存的变量中只有w1,b1,现在新增变量w2,b2 则只能导入w1,b1

saver = tf.train.Saver([w1, b1])

通过这种方法可以实现,只导入模型的前n-1层参数,而对第n层参数重新初始化训练,这样就能很好的实现迁移学习

4、补充 结合variable_scope

#!/usr/bin/python3
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
# import glob
import numpy as np
from tensorflow.contrib.layers.python.layers import batch_norm
import argparse

logdir='./output/'

with tf.variable_scope('conv'):
    w=tf.get_variable('w',[2,2],tf.float32,initializer=tf.random_normal_initializer)
    b=tf.get_variable('b',[2],tf.float32,initializer=tf.random_normal_initializer)
# with tf.variable_scope('conv2'):
#     w=tf.get_variable('w',[1,2],tf.float32,initializer=tf.random_normal_initializer)
#     b=tf.get_variable('b',[1],tf.float32,initializer=tf.random_normal_initializer)

sess=tf.InteractiveSession()

tf.global_variables_initializer().run() # 初始化所有变量

# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(logdir)
if ckpt and ckpt.model_checkpoint_path:
    # try:
    #     saver = tf.train.Saver()  # 参数为空,默认提取所有变量,
    #     saver.restore(sess, ckpt.model_checkpoint_path)
    #     saver = None
    # except:
        saver = tf.train.Saver([tf.variable_op_scope(w,name_or_scope='conv/w:0').args[0],
                                tf.variable_op_scope(b, name_or_scope='conv/b:0').args[0]])  # 上一步保存的变量有w1,b1,w2,b2,这里只提取w1,b1
        saver.restore(sess, ckpt.model_checkpoint_path)
        saver=None
# tf.variables_initializer([w2,b2]) # 初始化变量w2,b2

saver=tf.train.Saver() # 参数为空,默认保存所有变量,此处只保存所有变量,包括w2,b2
saver.save(sess,logdir+'model.ckpt')
print('w',w.eval())
print('-----------')
print('b',b.eval())
print('-----------')
# print('w',w2.eval())
# print('-----------')
# print('b',b2.eval())

sess.close()

说明:

with tf.variable_scope('conv'):
    w=tf.get_variable('w',[2,2],tf.float32,initializer=tf.random_normal_initializer)
    b=tf.get_variable('b',[2],tf.float32,initializer=tf.random_normal_initializer)
with tf.variable_scope('conv2'):
    w=tf.get_variable('w',[1,2],tf.float32,initializer=tf.random_normal_initializer)
    b=tf.get_variable('b',[1],tf.float32,initializer=tf.random_normal_initializer)
print('w',w.eval()) # 打印的是'conv2' 中的w
print('-----------')
print('b',b.eval())# 打印的是'conv2' 中的b

如果要打印的是’conv1’ 中的w,b

print('w',tf.variable_op_scope(w,name_or_scope='conv/w:0').args[0].eval())
print('-----------')
print('b',tf.variable_op_scope(b, name_or_scope='conv/b:0').args[0].eval())

打印’conv2’ 中的w,b也可以使用

print('w',tf.variable_op_scope(w,name_or_scope='conv2/w:0').args[0].eval())
print('-----------')
print('b',tf.variable_op_scope(b, name_or_scope='conv2/b:0').args[0].eval())
### 回答1: 使用 TensorFlow-GPU 进行深度学习任务需要以下步骤: 1. 安装CUDA和cuDNN:CUDA是 NVIDIA 的并行计算平台,cuDNN是一个加速深度学习的库,需要在安装CUDA之前先安装。 2. 安装GPU版本的TensorFlow:在安装完CUDA和cuDNN之后,需要安装对应版本的 TensorFlow-GPU,可以通过 pip 包管理器安装。 3. 编写并运行深度学习代码:使用 TensorFlow-GPU 编写深度学习代码,然后运行代码。 以下是一个简单的 TensorFlow-GPU 示例: ```python import tensorflow as tf # 创建两个张量并进行加法运算 with tf.device('/GPU:0'): a = tf.constant([1.0, 2.0, 3.0, 4.0], shape=[2, 2], name='a') b = tf.constant([4.0, 3.0, 2.0, 1.0], shape=[2, 2], name='b') c = tf.matmul(a, b) # 创建会话并运行计算图 with tf.Session() as sess: print(sess.run(c)) ``` 以上示例创建了两个张量并进行加法运算,使用 `with tf.device('/GPU:0')` 指定了使用 GPU 进行计算。最后创建会话并运行计算图。 需要注意的是,使用 TensorFlow-GPU 进行深度学习任务需要一定的硬件要求,需要具备 NVIDIA 的显卡和相应的驱动。 ### 回答2: 使用tensorflow-gpu进行深度学习任务需要按照以下步骤进行操作: 首先,安装CUDA和cuDNN。因为tensorflow-gpu利用CUDA和cuDNN来进行高效的GPU计算,所以需要先安装这两个工具。具体安装步骤可以参考官方文档。 接着,安装tensorflow-gpu。可以通过pip命令安装最新版本的tensorflow-gpu,例如:pip install tensorflow-gpu。安装完后,可以通过import tensorflow来验证是否安装成功。 然后,创建并配置TensorFlow的计算图。计算图是tensorflow中进行计算的基本单位,可以通过tf.Graph()创建一个新的计算图,并使用tf.ConfigProto()来设置运行的配置,例如使用哪个GPU设备。例如,可以使用with tf.device('/GPU:0')来表示使用第一个GPU设备。然后,使用tf.Session()来创建一个会话,并通过sess.run()来执行计算图。 接下来,定义模型的结构和各层的操作。tensorflow提供了丰富的API来定义各种深度学习模型,可以根据具体任务选择适合的API。例如,可以使用tf.layers中的API来定义卷积层、全连接层等。同时,还需要定义损失函数和优化器来进行模型的训练。 接着,加载数据并进行预处理。通过tensorflow提供的API,可以方便地加载各种格式的数据,并进行预处理,例如归一化、数据增强等。可以使用tf.data.Dataset来处理大规模数据,或者使用tf.train.shuffle_batch来进行小批量的数据处理。 最后,通过迭代训练模型,并评估模型的性能。可以使用tf.train模块中的API来定义训练过程和迭代次数。在每一次迭代中,使用sess.run()来执行计算图,并更新模型的参数。训练完成后,可以通过计算模型在验证集或测试集上的准确率等指标来评估模型的性能。 总结起来,使用tensorflow-gpu进行深度学习任务的具体步骤包括安装CUDA和cuDNN、安装tensorflow-gpu、创建计算图并配置运行环境、定义模型的结构和层操作、加载数据并进行预处理、迭代训练模型并评估性能。 ### 回答3: 使用tensorflow-gpu进行深度学习任务需要以下步骤: 1. 安装CUDA和cuDNN:tensorflow-gpu依赖于CUDA和cuDNN,需要先安装相应版本的CUDA和cuDNN,并配置环境变量。 2. 安装tensorflow-gpu:可以通过pip工具安装tensorflow-gpu,命令为:`pip install tensorflow-gpu`。 3. 导入tensorflow库:在Python代码中,使用`import tensorflow as tf`导入tensorflow库。 4. 创建计算图:使用tensorflow的API创建计算图,包括定义输入数据、模型结构、损失函数和优化算法。 5. 创建会话:使用`tf.Session()`创建一个tensorflow会话。 6. 运行计算图:使用会话的`run()`方法运行计算图,可以通过`feed_dict`参数传入训练数据,并用`fetch`参数获取输出结果。 7. 训练模型:在会话中,使用训练数据不断迭代优化模型参数,可以使用`tf.train.Optimizer`类定义优化算法,并使用`minimize()`方法来执行优化步骤。 8. 保存和加载模型:可以使用`tf.train.Saver()`类保存和加载模型,使用`save()`方法保存模型参数,使用`restore()`方法加载模型参数。 9. 预测和评估:使用训练好的模型对新数据进行预测,并进行评估。 总结来说,使用tensorflow-gpu进行深度学习任务主要包括安装依赖,导入库,创建计算图,创建会话,运行计算图,训练模型,保存和加载模型,预测和评估。使用tensorflow-gpu能够利用GPU的并行计算能力,加速深度学习任务的训练过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值