Go 两数相除
11个月前
变量通过 tf.Variable 类进行创建和跟踪。tf.Variable 表示张量,对它执行运算可以改变其值。利用特定运算可以读取和修改此张量的值。更高级的库(如 tf.keras)使用 tf.Variable 来存储模型参数。
import tensorflow as tf my_tensor = tf.constant([[1.0,2.0],[3.0,4.0]]) my_variable = tf.Variable(my_tensor) bool_variable = tf.Variable([False,False,False,True]) complex_variable = tf.Variable([5 + 4j, 6 + 1j]) #变量与张量的定义方式和操作都十分相似,实际上,它们都是tf.tensor支持 #的一种数据结构。与张量类似,变量也有dtype和形状,并且可以导出至Numpy。 print("Shape:",my_variable.shape) print("Dtype:",my_variable.dtype) print("As Numpy:",my_variable.numpy) #大部分张量运算在变量上也可以按预期运行,不过变量无法重构形状。 print("A variable:",my_variable) print("\nViewed as a tensor:",tf.convert_to_tensor(my_variable)) print("\nCopying and reshaping:",tf.reshape(my_variable,([1,4]))) #如上所述,变量由张量提供支持,可以使用tf.Variable.assign 重新分配张量。调用assign #(通常)不会分配新张量,而会重用现有张量的内存。 a = tf.Variable([2.0,3.0]) a.assign([1,2]) try: a.assign([1.0,2.0,.0]) except Exception as e: print(f"{type(e).__name__}:{e}") #如果在运算中像张量一样使用变量,那么通常会对支持张量执行运算。 #从现有变量创建新的变量会复制支持张量。两个变量不能共享同一内存空间。 a = tf.Variable([2.0,3.0]) b = tf.Variable(a) a.assign([5,6]) print(a.numpy()) print(b.numpy()) print(a.assign_add([2,3]).numpy()) print(a.assign_sub([7,9]).numpy()) #生命周期、命名和监视 #在基于Python的TensorFlow中,tf.Variable 实例与其他Python对象的生命周期相同 #如果没有对变量的引用,则会自动将其解除分配。 #为了便于跟踪和调试,可以为变量命名。两个变量可以使用相同的名称 a = tf.Variable(my_tensor,name="Mark") b = tf.Variable(my_tensor+1,name="Mark") print(a==b) #保存和加载模型时会保留变量名,默认情况下,模型中的变量会自动获取唯一变量名,所以 #除非您希望自行命名,否则不必多次一举。 #虽然变量对微分很重要,但某些变量不需要进行微分,在创建时通过将trainable设置为 #False可以关闭梯度。例如,训练计步器就是一个不需要梯度的变量。 step_counter = tf.Variable(1,trainable=False) #放置变量和张量 #为了提高性能,TensorFlow会尝试将张量和变量放在与其dtype兼容的最快设备上,这意味着 #如果有GPU,那么大部分变量都会放置在GPU上。 #不过,我们可以重写变量的位置。在一下代码中,即使存在可用的GPU,我们也可以将一个浮点 #张量和一个变量放置在GPU上。通过打开设备分配日志记录,可以查看变量的所在位置 #虽然可以手动放置变量但是用分布策略是一种可优化计算的更便捷且可扩展的方式。 #如果在有GPU和没有GPU的不同后端上运行此笔记本,则会看到不同的记录。请注意, #必须在会话开始时打开设备布局记录。 with tf.device('CPU:0'): a = tf.Variable([1.0,2.0,3.0],[4.0,5.0,6.0]) b = tf.constant([[1.0,2.0],[3.0,4.0],[5.0,6.0]]) c = tf.matmul(a,b) print(c)
留言簿