【TensorFlow-windows】name_scope与variable_scope

前言

探索一下variable_scopename_scope相关的作用域,为下一章节tensorboard的学习做准备

其实关于variable_scopeget_variable实现变量共享,在最开始的博客有介绍过:

【TensorFlow-windows】学习笔记二——低级API

当然还是国际惯例,参考博客:

tensorflow: name_scope 和 variable_scope区别及理解

tensorflow学习笔记(十七):name&variable scope

tensorflow官方文档name_scope

tensorflow官方文档get_varialbe

tensorflow官方文档variable_scope

variable_scope相关

先引入对应包:

import tensorflow as tf
import numpy as np

Variable定义的变量是否共享

a1 = tf.Variable(1,name='aaa')
a2 = tf.Variable(2,name='aaa')
init=tf.initialize_all_variables()
with tf.Session() as sess:sess.run(init)print(a1.eval())#1print(a2.eval())#2
print(a1) #<tf.Variable 'aaa:0' shape=() dtype=int32_ref>
print(a2) #<tf.Variable 'aaa_1:0' shape=() dtype=int32_ref>

结论:Variable定义的权重不共享,会自动给变量按照定义顺序加后缀_索引,比如第2此定义的aaa得到的名字是aaa_1,所以他们是完全不同的两个变量,名称也不同。

Variable定义与get_variable定义有什么区别

#variable创建方式
tf.Variable(<initial-value>, name=<optional-name>)
#get_variable创建方式
tf.get_variable(name,shape=None,dtype=None,initializer=None,regularizer=None,trainable=True,collections=None,caching_device=None,partitioner=None,validate_shape=True,use_resource=None,custom_getter=None,constraint=None
)

结论:Variable定义不实现共享,所以只需要初始值就行了,名字无所谓。get_variable要通过名字实现共享,所以必须给变量一个名字,其余无所谓。

直接定义两个同名的get_variable变量

b1 = tf.get_variable(name='b',initializer=10)
init = tf.initialize_all_variables()
with tf.Session() as sess:sess.run(init)print(b1.eval())#10
b2 = tf.get_variable(name='b',initializer=20)
'''
Variable b already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined at:
'''

结论:不能直接定义两个同名get_variable变量,必须通过特定方法实现共享

第一种共享方法

variable_scope内部使用reuse_variables函数:

with tf.variable_scope('dd') as scope:d1=tf.get_variable(name='d',initializer=10.0,dtype=tf.float32)scope.reuse_variables()d2=tf.get_variable(name='d',initializer=20.0,dtype=tf.float32)

上述在同一个变量空间中,定义两个同名变量,通过reuse_variable实现共享,输出结果如下:

print(d1,d2)
init=tf.initialize_all_variables()
with tf.Session() as sess:sess.run(init)print(d1.eval(),d2.eval())
'''
<tf.Variable 'dd/d:0' shape=() dtype=float32_ref> <tf.Variable 'dd/d:0' shape=() dtype=float32_ref>
10.0 10.0
'''

结论:可以通过reuse_variable实现共享,但是第二次初始化的值是无法覆盖第一次初始化的值的

第二种共享方法

在使用variable_scope建立变量空间的时候,如果是复用一个已定义的变量空间中的变量,直接将reuse设置为True

with tf.variable_scope('ff') as scope:f1=tf.get_variable(name='f',initializer=10.0,dtype=tf.float32)
with tf.variable_scope('ff',reuse=True) as scope:f2=tf.get_variable(name='f',initializer=20.0,dtype=tf.float32)
with tf.variable_scope('gg') as scope:g=tf.get_variable(name='f',initializer=20.0,dtype=tf.float32)

输出看看

print(f1,f2,g)
init=tf.initialize_all_variables()
with tf.Session() as sess:sess.run(init)print(f1.eval(),f2.eval(),g.eval())
'''
<tf.Variable 'ff/f:0' shape=() dtype=float32_ref> <tf.Variable 'ff/f:0' shape=() dtype=float32_ref> <tf.Variable 'gg/f:0' shape=() dtype=float32_ref>
10.0 10.0 20.0
'''

结论:可以通过函数参数reuse实现变量共享

不同变量空间中的相同名称变量是否共享

结论:无法共享,比如上例中f1g无法共享,虽然名称都是f,但是所在变量空间不同。

第三种共享方法

调用函数的时候,自动检测是否需要reuse

with tf.variable_scope('ee',reuse=tf.AUTO_REUSE) as scope:e2=tf.get_variable(name='e',initializer=10.0,dtype=tf.float32)e3=tf.get_variable(name='e',initializer=20.0,dtype=tf.float32)
with tf.variable_scope('ee',reuse=tf.AUTO_REUSE) as scope:e4=tf.get_variable(name='e',initializer=30.0,dtype=tf.float32)
init = tf.initialize_all_variables()
with tf.Session() as sess:sess.run(init)print(e2,e3,e4)print(e2.eval(),e3.eval(),e4.eval())
'''
<tf.Variable 'ee/e:0' shape=() dtype=float32_ref> <tf.Variable 'ee/e:0' shape=() dtype=float32_ref> <tf.Variable 'ee/e:0' shape=() dtype=float32_ref>
10.0 10.0 10.0
'''

如果之前没创建过共享变量,不适用自动检测,而直接reuse会报错

with tf.variable_scope('ee',reuse=True) as scope:e2=tf.get_variable(name='e',initializer=10.0,dtype=tf.float32)
'''Variable ee/e does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=tf.AUTO_REUSE in VarScope?
'''

结论:如果不确定之前是否创建过共享变量,最好是使用AUTO_REUSE自动检测

name_scope相关

直接用namescope是否能隔绝共享变量

with tf.name_scope('f') as nscope:f1 = tf.get_variable('f',initializer=10.0,dtype=tf.float32)
with tf.name_scope('g') as nscope:g = tf.get_variable('f',initializer=20.0,dtype=tf.float32)
'''
Variable f already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined at:
'''

结论:无法直接用name_scope隔绝共享变量

在不同namesope中是否可以共享变量

创建两个命名空间,但是两个命名空间包含相同的变量空间,设置共享变量h

with tf.name_scope('test1') as scope:with tf.variable_scope('h',reuse=tf.AUTO_REUSE):h1 = tf.get_variable('hh',initializer=10.0,dtype=tf.float32)
with tf.name_scope('test2') as scope:with tf.variable_scope('h',reuse=tf.AUTO_REUSE):h2 = tf.get_variable('hh',initializer=10.0,dtype=tf.float32)

测试是否能实现变量共享

init = tf.initialize_all_variables()
with tf.Session() as sess:sess.run(init)print(h1,h2)print(h1.eval(),h2.eval())op=tf.assign(h1,30.0)sess.run(op)print(h1.eval(),h2.eval())
'''
<tf.Variable 'h/hh:0' shape=() dtype=float32_ref> <tf.Variable 'h/hh:0' shape=() dtype=float32_ref>
10.0 10.0
30.0 30.0
'''

结论:命名空间不能控制是否共享,但是变量空间可以控制变量共享。

总结

get_variablevariable_scope配合可以实现变量共享。

name_scope无法实现变量共享,但是如果看过之前的博客可以发现,它的一个作用是将一系列操作封装在一起,这样画图的时候网络结构比较清晰。

其它作用以后遇到再补充,主要是为了下一章节学习tensorboard做准备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TensorFlow-windows】TensorBoard可视化

前言 紧接上一篇博客&#xff0c;学习tensorboard可视化训练过程。 国际惯例&#xff0c;参考博客&#xff1a; MNIST机器学习入门 Tensorboard 详解&#xff08;上篇&#xff09; Tensorboard 可视化好帮手 2 tf-dev-summit-tensorboard-tutorial tensorflow官方mnist_…

深度学习特征归一化方法——BN、LN、IN、GN

前言 最近看到Group Normalization的论文&#xff0c;主要提到了四个特征归一化方法&#xff1a;Batch Norm、Layer Norm、Instance Norm、Group Norm。此外&#xff0c;论文还提到了Local Response Normalization(LRN)、Weight Normalization(WN)、Batch Renormalization(BR)…

【TensorFlow-windows】keras接口——利用tensorflow的方法加载数据

前言 之前使用tensorflow和keras的时候&#xff0c;都各自有一套数据读取方法&#xff0c;但是遇到一个问题就是&#xff0c;在训练的时候&#xff0c;GPU的利用率忽高忽低&#xff0c;极大可能是由于训练过程中读取每个batch数据造成的&#xff0c;所以又看了tensorflow官方的…

【TensorFlow-serving】初步学习模型部署

前言 初步学习tensorflow serving的手写数字识别模型部署。包括简单的模型训练、保存、部署上线。因为对docker和网络不太熟悉&#xff0c;可能会有部分错误&#xff0c;但是看完博客&#xff0c;能跑通整个流程。此博客将详细介绍流程&#xff0c;但是不详细介绍每个流程的每…

Tensorflow 指令加速

一直没注意过使用Tensorflow的时候有一条warning&#xff1a; Warning: your cpu supports instructions that this tensorflow binary was not compiled to use: avx2 fma这玩意是可以用来加速推断的&#xff0c;分CPU和GPU版&#xff0c;业务相关部署在CPU上&#xff0c;实测…

骨骼动画——论文与代码精读《Phase-Functioned Neural Networks for Character Control》

前言 最近一直玩CV&#xff0c;对之前学的动捕知识都忘得差不多了&#xff0c;最近要好好总结一下一直以来学习的内容&#xff0c;不能学了忘。对2017年的SIGGRAPH论文《Phase-Functioned Neural Networks for Character Control》进行一波深入剖析吧&#xff0c;结合源码。 额…

颜色协调模型Color Harmoniztion

前言 最近做换脸&#xff0c;在肤色调整的那一块&#xff0c;看到一个有意思的文章&#xff0c;复现一波玩玩。不过最后一步掉链子了&#xff0c;有兴趣的可以一起讨论把链子补上。 主要是github上大佬的那个复现代码和原文有点差异&#xff0c;而且代码复杂度过高&#xff0…

Openpose推断阶段原理

前言 之前出过一个关于openpose配置的博客&#xff0c;不过那个代码虽然写的很好&#xff0c;而且是官方的&#xff0c;但是分析起来很困难&#xff0c;然后再opencv相关博客中找到了比较清晰的实现&#xff0c;这里分析一波openpose的推断过程。 国际惯例&#xff0c;参考博…

换脸系列——眼鼻口替换

前言 想着整理一下换脸相关的技术方法&#xff0c;免得以后忘记了&#xff0c;最近脑袋越来越不好使了。应该会包含三个系列&#xff1a; 仅换眼口鼻&#xff1b;换整个面部&#xff1b;3D换脸 先看看2D换脸吧&#xff0c;网上已经有现成的教程了&#xff0c;这里拿过来整理一…

换脸系列——整脸替换

前言 前面介绍了仅替换五官的方法&#xff0c;这里介绍整张脸的方法。 国际惯例&#xff0c;参考博客&#xff1a; [图形算法]Delaunay三角剖分算法 维诺图&#xff08;Voronoi Diagram&#xff09;分析与实现 Delaunay Triangulation and Voronoi Diagram using OpenCV (…

3D人脸重建——PRNet网络输出的理解

前言 之前有款换脸软件不是叫ZAO么&#xff0c;分析了一下&#xff0c;它的实现原理绝对是3D人脸重建&#xff0c;而非deepfake方法&#xff0c;找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。 国际惯例&#xff0c;参考博客&#xff1a; 什…

tensorflow官方posenet模型解析

前言 tensorflow官方有个姿态估计项目&#xff0c;这个输入和openpose还有点不一样&#xff0c;这里写个单人情况下的模型输出解析方案。 国际惯例&#xff0c;参考博客&#xff1a; 博客: 使用 TensorFlow.js 在浏览器端上实现实时人体姿势检测 tensorflow中posnet的IOS代…

tensorflow2安装时候的一个dll找不到的错误

电脑环境&#xff1a; vs2015python3.7.6&#xff0c;使用anaconda安装的CUDA 10.1cuDnn 7.6.5tensorflow2.1.0 错误内容 File "C:\Users\zb116\anaconda3\lib\imp.py", line 242, in load_modulereturn load_dynamic(name, filename, file)File "C:\Users\z…

PCA、SVD、ZCA白化理论与实现

简介 在UFLDL中介绍了主成分分析这一块的知识&#xff0c;而且当时学机器学习的时候&#xff0c;老师是将PCA和SVD联系起来将的&#xff0c;同时UFLDL也讲到了使用PCA做数据白化whitening处理&#xff0c;这个词经常在论文里面看到。 国际惯例&#xff0c;参考博客&#xff1…

OpenCV使用Tensorflow2-Keras模型

前言 最近工作上需要在C上快速集成Tensorflow/Keras训练好的模型&#xff0c;做算法验证。首先想到的就是opencv里面的dnn模块了&#xff0c;但是它需要的格式文件比较郁闷&#xff0c;是pb格式的模型&#xff0c;但是keras通常保存的是h5文件&#xff0c;查阅了很多资料&…

3D人脸表情驱动——基于eos库

前言 之前出过三篇换脸的博文&#xff0c;遇到一个问题是表情那一块不好处理&#xff0c;可行方法是直接基于2D人脸关键点做网格变形&#xff0c;强行将表情矫正到目标人脸&#xff0c;还有就是使用PRNet的思想&#xff0c;使用目标人脸的顶点模型配合源人脸的纹理&#xff0c…

3D姿态估计——ThreeDPose项目简单易用的模型解析

前言 之前写过tensorflow官方的posenet模型解析&#xff0c;用起来比较简单&#xff0c;但是缺点是只有2D关键点&#xff0c;本着易用性的原则&#xff0c;当然要再来个简单易用的3D姿态估计。偶然看见了ThreeDPose的项目&#xff0c;感觉很强大的&#xff0c;所以把模型扒下来…

简易的素描图片转换流程与实现

前言 之前经常在网上看到用PS实现真实图片到素描图片的转换&#xff0c;但是流程都大同小异&#xff0c;身为一只程序猿&#xff0c;必须来个一键转化额。 国际惯例&#xff0c;参考博客&#xff1a; Photoshop基础教程&#xff1a;混合模式原理篇 颜色减淡的原理讲解以及应…

一个简单好用的磨皮祛斑算法理论和python实现

前言 最近看了一个磨皮算法祛斑感觉效果不错&#xff0c;效果图看文末就行&#xff0c;个人觉得效果非常不错滴。 国际惯例&#xff0c;参考博客&#xff1a; 磨皮算法的源码&#xff1a;YUCIHighPassSkinSmoothing How To Smooth And Soften Skin With Photoshop 图像算法…

OpenVINO——配置与道路分割案例

前言 最近看到了一个深度学习库OpenVINO&#xff0c;专门用于Intel硬件上部署深度学习模型&#xff0c;其内置了非常非常多使用的预训练模型&#xff0c;比如道路分割、人脸提取、3D姿态估计等等。但是配置和调用有点小恶心&#xff0c;这里以道路分割为例&#xff0c;展示如何…