当前位置: 首页 > 面试题库 >

TensorFlow变量和常量

乌学博
2023-03-14
问题内容

我是tensorflow的新手,我无法理解变量和常量的区别,我知道我们将变量用于方程式,将常量用于直接值,但是为什么代码#1仅工作,为什么代码#2和#
3,请说明在哪种情况下我们必须先运行图形(a),然后运行变量(b),即

 (a) session.run(model)
 (b) print(session.run(y))

在这种情况下,我可以直接执行此命令,即

print(session.run(y))

代码1:

x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')

model = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(model)
    print(session.run(y))

代码2:

x = tf.Variable(35, name='x')
y = tf.Variable(x + 5, name='y')

model = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(model)
    print(session.run(y))

代码3:

x = tf.constant(35, name='x')
y = tf.constant(x + 5, name='y')

model = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(model)
    print(session.run(y))

问题答案:

在TensorFlow中,常量和变量之间的区别在于,当您声明某个常量时,其值以后将无法更改(而且初始化应使用值
而不是操作 )。

但是,在声明变量时,将来可以使用tf.assign()方法更改其值(并且可以通过值或操作来实现初始化)。

函数tf.global_variables_initializer()使用作为参数传递的值初始化代码中的所有变量,但它在异步模式下工作,因此当变量之间存在依赖关系时,该函数将无法正常工作。

您的第一个代码(#1)正常工作,因为不依赖于变量初始化,并且常量是用值构造的。

由于的异步行为,第二个代码(#2)不起作用tf.global_variables_initializer()。您可以使用tf.variables_initializer()对其进行修复,如下所示:

x = tf.Variable(35, name='x')
model_x = tf.variables_initializer([x])

y = tf.Variable(x + 5, name='y')
model_y = tf.variables_initializer([y])


with tf.Session() as session:
   session.run(model_x)
   session.run(model_y)
   print(session.run(y))

第三个代码(#3)无法正常工作,因为您试图通过操作初始化常量,这是不可能的。要解决此问题,适当的策略是(#1)。

关于您的最后一个问题。(a) session.run(model)当计算图中有变量时,您需要运行(b) print(session.run(y))



 类似资料:
  • 变量数据类型的作用 程序员写代码时识别用:知道变量中应该存放什么类型的数值 给编译器看的:说明数值在存储时需要的内存空间字节数;说明存储结构 普通变量数据类型转换的本质 将数据的空间大小和数据的存储结构转变后,存入另一个变量空间 数据类型转换会导致数据存储空间大小和存储结构的变化 变量的本质 变量三要素:名称、大小、作用域 既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。

  • 局部变量 实例变量 类变量 全局变量 伪变量 常数 引用常数的优先顺序 您可以通过区分Ruby变量名的首位字符来确定它是局部变量、实例变量、类变量、全局变量还是常数。通常情况下,变量名的第二位字符以后是数字、字母或下划线,但有的内部变量名比较特殊,如“'$'+1个符号”(请参考内部变量)。变量名长度只受内存大小的限制。 局部变量 例: foobar 若标识符首位是小写字母或“_”,则该标识符就是

  • 变量是计算机内存中已命名的存储位置,其中包含了数字或字符串等数据。变量包含的信息被称为变量的值。变量使用用户便于理解脚本操作的名称为用户提供了一种存储、检索和操作数据的途径。 声明和命名变量 命名和声明变量应遵循脚本语言的规则及指导。即使在使用变量前不需要去声明变量,也应养成在编程时声明变量的良好习惯,因为这样有助于防止错误发生。声明一个变量意味着告诉脚本引擎,有一个特定名称的变量,这样就可以在脚

  • 一. cmake 变量引用的方式 前面我们已经提到了,使用${}进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过${}取值。 二. cmake 自定义变量的方式 主要有隐式定义和显式定义两种,前面举了一个隐式定义的例子,就是 PROJECT 指令,他会隐式的定义<projectname>_BINARY_DIR 和<projectname>_SOURCE_DIR两个变量。 显式定义的例子

  • 程序中的一切变量的初始值都直接或间接地依赖常量或常量表达式生成。在Go语言中很多变量是默认零值初始化的,但是Go汇编中定义的变量最好还是手工通过常量初始化。有了常量之后,就可以衍生定义全局变量,并使用常量组成的表达式初始化其它各种变量。本节将简单讨论Go汇编语言中常量和全局变量的用法。 3.3.1 常量 Go汇编语言中常量以$美元符号为前缀。常量的类型有整数常量、浮点数常量、字符常量和字符串常量等

  • 问题内容: Java语言文档说: 如果将原始类型或字符串定义为常量,并且在编译时知道该值,则编译器会使用其值替换代码中各处的常量名称。这称为编译时常量。 我的理解是,如果我们有一段代码: 然后,编译器会将x代码中每次出现的内容替换为literal 10。 但假设常量在运行时初始化: 与编译时常量相比,性能是否会下降(无论可以忽略不计)? 另一个问题是下面的代码行: 被编译器以与编译时常量相同的方式