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

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Python之变量命名规则详解

《Python之变量命名规则详解》Python变量命名需遵守语法规范(字母开头、不使用关键字),遵循三要(自解释、明确功能)和三不要(避免缩写、语法错误、滥用下划线)原则,确保代码易读易维护... 目录1. 硬性规则2. “三要” 原则2.1. 要体现变量的 “实际作用”,拒绝 “无意义命名”2.2. 要让

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例