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

相关文章

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java