tensorflow基础学习——变量管理—tf.variable_scope()

2024-04-29 04:48

本文主要是介绍tensorflow基础学习——变量管理—tf.variable_scope(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

变量管理即是当神经网络参数在网络结构更加复杂的时候,参数更加多的时候,来用一个更好的方式来管理网络神经的参数,tensorflow提供他送过名称来创建或者获取一个变量名的机制,通过这个机制,在不同函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式来传递。
在创建变量的时候采用的“tf.get_variable()与tf.Variable()”等价,下面两种表达方式是等价的:

#下面两种方式是等价的
v=tf.get_variable("v",shape=[1],initializer=tf.constant_initializer(1.0))
v=tf.Variable(tf.constant(1.0,shape=[1]),name="v")

tf.get_ variable 函数与tf.Variable 函数最大的区别在于指定变量名称的参数。对于tf.Variable 函数, 变量名称是一个可选的参数,通过name= ~”的形式给出。但是对于tf.get_ variable 函数,变量名称是一个必填的参数。tf.get_variable 会根据这个名字去创建或者获取变量。在以上样例程序中, tf.get_variable 首先会试图去创建一个名字为v 的参数,如果创建失败(比如已经有同名的参数),那么这个程序就会报错。这是为了避免无意识的变量复用造成的错误。比如在定义神经网络参数时,第一层网络的权重已经叫weights 了,那么在创建第二层神经网络时,如果参数名仍然叫weights ,就会触发变量重用的错误。否则两层神经网络共用一个权重会出现一些比较难以发现的错误。如果需要通过tf.get_ variable 获取一个已经创建的变量,需要通过tf. variable_ scope 函数来生成一个上下文管理器,并明确指定在这个上下文管理器中, tf.get_variable 将直接获取己经生成的变量。下面给出了一段代码说明如何通过tf. variable_ scope 函数来控制tf.get_variable 函数获取己经创建过的变量。

#在名字为foo的命名空间中创建名字为v的变量
with tf.variable_scope("foo"):v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) 
#因为在命名空间里foo中的已经存在名字变量为v的变量了,所以会出现报错
with tf.variable_scope("foo",reuse=True):v=tf.get_variable("v",[1])#在生成上下文管理器时,将参数reuse设置为true。这样tf.get_variable函数将直接
#获取已经申明的变量
with tf.variable_scope("foo",reuse=True):v1=tf.get_variable("v",[1])print(v==v1)#输出为true
#命名空间为bar中没有创建变量v,则下列代码会报错:
with tf.variable_scope("bar",reuse=True):v=tf.get_variable("v",[1])   

tf.variable_scope函数嵌套时:
为指定reuse时,reuse为false,当有指定时,为指定值,镶嵌管理器的reuse值与外层保持一致。

with tf.get_variable_scope("root"):#可以通过tf.get_variable_scope().reuse函数来获取当前文的#reuse值print(tf.get_variable_scope().reuse)#输出当前的false,即最外层reuse是falsewith tf.variable_scope("foo",reuse=True):#新建一个上下文管理器,且指定reuse=trueprint(tf.get_variable_scope().reuse) #输出为TRUEwith tf.variable_scope("bar"):#嵌套一个上下文管理器,不指定reuse,#此时该管理器的值与外层保持一致print(tf.get_variable_scope().reuse)#当退出reuse=true的层后,最外层的reuse仍然为falseprint(tf.get_variable_scope().reuse)  

用在mnist的数据集中:

def inference(input_tensor,reuse=False):#定义第一层神经网络的前向传播过程with tf.Variable_scope('layer1',reuse=reuse):#根据传进来的reuse来判断是否创建变量还是使用已经# 创建好的,weights=tf.get_variable("weights",[INPUT_NODE,LAYER1NODE],initializer=tf.truncated_normal_initializer(stddev=0.1))  biases=tf.get_variable("biases",[LAYER1_NODE],initializer=tf.constant_initializer(0.0))   layer1=tf.nn.relu(tf.matmul(input_tensor,weights)+biases)    #类似定义第二层的神经网络的变量与前向传播过程   with tf.Variable_scope('layer2',reuse=reuse):#根据传进来的reuse来判断是否创建变量还是使用已经# 创建好的,weights=tf.get_variable("weights",[INPUT_NODE,LAYER1NODE],initializer=tf.truncated_normal_initializer(stddev=0.1))  biases=tf.get_variable("biases",[LAYER1_NODE],initializer=tf.constant_initializer(0.0))   layer2=tf.matmul(input_tensor,weights)+biases#返回最后的传播结果return layer2
x=tf.placeholder(tf.float32,[None,INPUT_NODE],name='x-input')
y=inference(x)

使用上述的代码可以不再需要将所有的变量都作为参数都传递到函数中去了,当神经网络更加复杂的时候,参数更多的时候,使用这种变量可以大大提高程序的可读性。

这篇关于tensorflow基础学习——变量管理—tf.variable_scope()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945150

相关文章

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java