Tensorflow框架 -- 模型的保存与恢复

一、模型保存与恢复

tensorflow 模型保存类,Class Saver(),初始化对象saver

saver = tf.train.Saver()

def __init__(self,
             var_list=None,
             reshape=False,
             sharded=False,
             max_to_keep=5,
             keep_checkpoint_every_n_hours=10000.0,
             name=None,
             restore_sequentially=False,
             saver_def=None,
             builder=None,
             defer_build=False,
             allow_empty=False,
             write_version=saver_pb2.SaverDef.V2,
             pad_step_number=False,
             save_relative_paths=False,
             filename=None):

常用的参数如下
  var_list:需要保存或恢复的的变量或者对象列表,默认是所有可保存的变量或者对象,通常使用默认值None。
  max_to_keep: 保存模型的数量,超过则会自动删除早期保存的模型。
  keep_checkpoint_every_n_hours:保存模型的间隔时间,默认情况下禁用该参数。

saver.save()

  def save(self,
           sess,
           save_path,
           global_step=None,
           latest_filename=None,
           meta_graph_suffix="meta",
           write_meta_graph=True,
           write_state=True,
           strip_default_attrs=False):

常用参数如下
  sess:会话,保存模型必须要基于图和会话内。
  save_path:保存路径和名字。
  global_step:全局训练步骤,记录训练位置,可用于模型的恢复

saver.restore()

def restore(self, sess, save_path):
    Args:
      sess: A `Session` to use to restore the parameters.
      save_path: Path where parameters were previously saved.

在恢复预训练模型部分参数时,需要注意如下

  • 变量通常保存的形式为:<tf.Variable 'resnet_v2_50/conv1/weights:0' shape=(7, 7, 3, 64) dtype=float64>
  • load = tf.train.Saver()初始化对象时var_list参数,那么在调用load.restore()时,恢复的权重就是var_list中名字对应的权重值。

二、Fine-tune下模型的保存与恢复

深度学习的任务都是在已经训练好的模型上进行微调或者迁移学习。比如语义分割,目标检测任务,通常在分类数据集ImageNet上训练的模型作为主干网络(VGG,ResNet 作为 BackBone),然后迁移到其它任务场景继续训练。

下面以yolo-v3的部分代码为实例进行说明:

代码参考:https://github.com/YunYang1994/tensorflow-yolov3

代码中预加载的权重是DarkNet-53在ImageNet和coco(80类)上预训练网络。我们需要使用预训练的网络作为起点,进行一类目标检测的任务,因此网络的最后三层有变化。(?,?,?,255)=》(?,?,?,18)。所以,预训练模型的权重无法全部加载到新的DarkNet-53网络(事实上,只是最后三层的变化 [‘conv_sbbox’, ‘conv_mbbox’, ‘conv_lbbox’])。

... ...

with tf.name_scope("define_first_stage_train"):
	self.first_stage_trainable_var_list = []
	for var in tf.trainable_variables():
		var_name = var.op.name
		var_name_mess = str(var_name).split('/')
		
		# 只将最后三层的变量进行微调优化,网络其它部分参数冻结(frozen),不参与训练
		# 当最后三层优化差不多了,然后放开整个网络,整体优化
		if var_name_mess[0] in ['conv_sbbox', 'conv_mbbox', 'conv_lbbox']:
			self.first_stage_trainable_var_list.append(var)
	
	first_stage_optimizer = tf.train.AdamOptimizer(self.learn_rate)
	
	# 设定优化器优化变量列表
	part_var_op = first_stage_optimizer.minimize(self.loss, var_list=self.first_stage_trainable_var_list)

with tf.name_scope("define_second_stage_train"):
	second_stage_trainable_var_list = tf.trainable_variables()
	second_stage_optimizer = tf.train.AdamOptimizer(self.learn_rate)
	
	# 设定优化器优化变量列表
	train_op_all_variables = first_stage_optimizer.minimize(self.loss, var_list=self.second_stage_trainable_var_list )

with tf.name_scope('loader_and_saver'):
	# 由于新的任务,最后三层的shape有变化,所以只能加载其它权重参数
	variables_to_restore = []
	for v in self.global_variables():
		if v.name.split('/')[0] not in ['conv_sbbox', 'conv_mbbox', 'conv_lbbox']:
			variables_to_restore.append(v)
	
	# 默认val_list=None,此时需要修改为 =》需要restore的变量,所以需要特别指定
	self.loader = tf.train.Saver(variables_to_restore)
	self.saver = tf.train.Saver(tf.global_variables(), max_to_keep=100)

def train(self):
	self.sess.run(tf.global_variabels_initializer())
	start_epoch = 1
	try:
		print('=> Restoring weights form: %s ...' % self.initial_weight)
		sefl.loader.restore(self.sess, self.initial_weight)
	except:
		print('=> % s does not exist !!!' % self.initial_weight)
		print('=> Not it starts to train YOLOV3 from scratch ...')
		self.first_stage_epochs = 0 
	
	for epoch in range(start_epoch, 1 + self.first_stage_epoch + self.second_stage_epoch):
		self.sess.run([], feed_dict={})
	
		self.saver.save(self.sess, save_path, global_step=epoch)	

加载预训练权重的步骤

  1. 获取预训练模型每一层变量 var.

    variables_to_restore = []
    for v in self.global_variables():
    	# 打印所有变量
    	print(v)
    	# 确定需要恢复权重的变量,放入列表
    	if v.name.split('/')[0] not in ['conv_sbbox', 'conv_mbbox', 'conv_lbbox']:
    		variables_to_restore.append(v)
    
  2. 确定要加载的权重,将变量加入variables_to_restore.

  3. 初始化权重恢复对象

    # 初始化loader的时候,指定了需要恢复权重的变量列表
    self.loader = tf.train.Saver(variables_to_restore)
    
  4. 加载指定变量的预训练权重

    try:
    	print('=> Restoring weights form: %s ...' % self.initial_weight)
    	sefl.loader.restore(self.sess, self.initial_weight)
    except:
    	print('=> % s does not exist !!!' % self.initial_weight)
    	print('=> Not it starts to train YOLOV3 from scratch ...')
    	self.first_stage_epochs = 0 
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: dncnn-denoise-gaussian-noise-tensorflow-master 是一个基于 TensorFlow 框架的去噪神经网络模型。 DNCNN(Dense Convolutional Neural Network)是一种密集卷积神经网络,用于图像去噪任务。它具有多个卷积层,每个卷积层都具有更多的卷积核,以增加网络的感知能力。这使得 DNCNN 在处理图像中的高斯噪声方面表现出色。 该模型的主要目标是去除图像中的高斯噪声。高斯噪声是一种常见的图像噪声,它具有随机性和连续性,由于传感器的限制、信号传输中的干扰或图像采集过程中的其他因素而产生。这种噪声会降低图像的质量并影响后续图像处理任务的效果。 通过训练,dncnn-denoise-gaussian-noise-tensorflow-master 模型学习如何通过卷积层进行特征提取,并使用残差学习来学习重建干净图像。网络的输入是噪声图像,输出是去噪后的图像。通过对许多含有噪声和干净图像对的训练样本进行迭代训练,模型能够学习去除高斯噪声,并还原出更清晰的图像。 该模型主要依赖于 TensorFlow 框架来构建神经网络结构和进行训练。TensorFlow 是一个开源机器学习框架,提供了一套丰富的工具和库,方便有效地实现各种深度学习模型。通过使用 TensorFlow,我们可以更方便地搭建、训练和测试 DNCNN 模型,以实现图像去噪的目标。 总而言之,dncnn-denoise-gaussian-noise-tensorflow-master 是一个使用 TensorFlow 构建的神经网络模型,旨在通过训练去除图像中的高斯噪声,并恢复出清晰的图像。它通过密集卷积神经网络结构和残差学习来实现这一目标,并利用 TensorFlow 提供的功能来简化模型的构建和训练过程。 ### 回答2: "DnCNN-denoise-gaussian-noise-tensorflow-master"是一个基于TensorFlow开发的用于去除高斯噪声的深度神经网络模型。DnCNN代表深度卷积神经网络去噪,它是一种用于图像去噪的先进方法。高斯噪声是一种常见的图像噪声类型,它以正态分布为基础生成,对于图像质量和清晰度有很大影响。 这个项目的目标是利用DnCNN模型,使用TensorFlow实现去除高斯噪声的功能。TensorFlow是一个开源的机器学习框架,提供了丰富的工具和函数库,用于构建和训练深度神经网络模型。通过使用TensorFlow,我们可以高效地创建、训练和优化深度学习模型。 该项目的"master"表示主分支,通常是最新、最稳定的版本。这意味着"DnCNN-denoise-gaussian-noise-tensorflow-master"是基于最新版本的DnCNN网络,并且已经在TensorFlow上进行了实现。 通过使用这个项目,我们可以将含有高斯噪声的图像输入到DnCNN模型中,并得到去噪后的输出图像。这个模型能够学习和理解高斯噪声的特征,并将其从图像中去除,以恢复图像的真实细节和清晰度。这对于许多计算机视觉任务,如人脸识别、图像增强和图像分析等都是非常有用的。 总之,"DnCNN-denoise-gaussian-noise-tensorflow-master"是一个基于TensorFlow实现的高斯噪声去除深度学习模型,它可以帮助我们有效地去除图像中的高斯噪声,提高图像质量和清晰度。 ### 回答3: dncnn-denoise-gaussian-noise-tensorflow-master 是一个基于TensorFlow框架实现的深度卷积神经网络(DnCNN)用于去噪高斯噪声的开源项目。 去噪是数字图像处理中的一个重要任务,因为图像数据常常受到各种噪声的干扰,其中高斯噪声是一种常见的噪声类型。dncnn-denoise-gaussian-noise-tensorflow-master提供了一种通过深度学习方法去除高斯噪声的解决方案。 该项目的实现基于深度卷积神经网络(DnCNN)。深度卷积神经网络是一种具有多层卷积和池化层的神经网络结构,通过学习数据的高级特征来实现图像去噪。DnCNN主要由卷积层、批归一化层和ReLU激活函数组成,通过多层卷积操作来逐渐去噪图像。 在dncnn-denoise-gaussian-noise-tensorflow-master项目中,程序提供了对高斯噪声图像进行训练和测试的功能。用户可以使用该项目来训练自己的去噪模型,也可以使用已经训练好的模型来去噪自己的图像数据。项目还提供了一些辅助功能,如数据加载和保存、网络模型的定义和训练等。 使用dncnn-denoise-gaussian-noise-tensorflow-master可以帮助用户实现高效的图像去噪处理,降低图像中的噪声干扰,提升图像的质量。该项目的开源特性使得用户可以根据自己的需求进行修改和扩展,也可以从中学习深度学习和图像去噪的相关知识和技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值