tf.Variable的用处以及其他tf中创建的命令

本文深入解析了TensorFlow中的变量与参数概念,包括变量的创建、初始化、使用及保存方法。通过实例演示了如何在TensorFlow中创建、初始化变量,并进行基本的数学运算。此外,还介绍了TensorFlow中生成张量的各种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自简书 https://www.jianshu.com/p/2b9e475391ab
看了一圈网上的觉得这篇写的是最好的,很清楚,与各位分享

1、定义—简单一句话“参数”
我们使用变量Variables去更新参数。变量在内存中。
2、创建
例子:

Create two variables.

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name=“weights”)
biases = tf.Variable(tf.zeros([200]), name=“biases”)

生成tensor的一些方法
生成tensor:
tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros_like(tensor, dtype=None, name=None)
tf.constant(value, dtype=None, shape=None, name=‘Const’)
tf.fill(dims, value, name=None)
tf.ones_like(tensor, dtype=None, name=None)
tf.ones(shape, dtype=tf.float32, name=None)

生成序列
tf.range(start, limit, delta=1, name=‘range’)
tf.linspace(start, stop, num, name=None)

生成随机数
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.random_uniform(shape, minval=0.0, maxval=1.0, dtype=tf.float32, seed=None, name=None)
tf.random_shuffle(value, seed=None, name=None)

例子
import tensorflow as tf
import numpy as np

生成0和1矩阵

v1 = tf.Variable(tf.zeros([3,3,3]), name=“v1”)
v2 = tf.Variable(tf.ones([10,5]), name=“v2”)

#填充单值矩阵
v3 = tf.Variable(tf.fill([2,3], 9))

#常量矩阵
v4_1 = tf.constant([1, 2, 3, 4, 5, 6, 7])
v4_2 = tf.constant(-1.0, shape=[2, 3])

#生成等差数列
v6_1 = tf.linspace(10.0, 12.0, 30, name=“linspace”)#float32 or float64
v7_1 = tf.range(10, 20, 3)#just int32

#生成各种随机数据矩阵
v8_1 = tf.Variable(tf.random_uniform([2,4], minval=0.0, maxval=2.0, dtype=tf.float32, seed=1234, name=“v8_1”))
v8_2 = tf.Variable(tf.random_normal([2,3], mean=0.0, stddev=1.0, dtype=tf.float32, seed=1234, name=“v8_2”))
v8_3 = tf.Variable(tf.truncated_normal([2,3], mean=0.0, stddev=1.0, dtype=tf.float32, seed=1234, name=“v8_3”))
v8_4 = tf.Variable(tf.random_uniform([2,3], minval=0.0, maxval=1.0, dtype=tf.float32, seed=1234, name=“v8_4”))
v8_5 = tf.random_shuffle([[1,2,3],[4,5,6],[6,6,6]], seed=134, name=“v8_5”)

初始化

init_op = tf.initialize_all_variables()

保存变量,也可以指定保存的内容

saver = tf.train.Saver()
#saver = tf.train.Saver({“my_v2”: v2})

#运行
with tf.Session() as sess:
sess.run(init_op)

输出形状和值

print tf.Variable.get_shape(v1)#shape
print sess.run(v1)#vaule

numpy保存文件

np.save(“v1.npy”,sess.run(v1))#numpy save v1 as file
test_a = np.load(“v1.npy”)
print test_a[1,2]

#一些输出
print sess.run(v3)

v5 = tf.zeros_like(sess.run(v1))

print sess.run(v6_1)

print sess.run(v7_1)

print sess.run(v8_5)

#保存图的变量
save_path = saver.save(sess, “/tmp/model.ckpt”)
#加载图的变量
#saver.restore(sess, “/tmp/model.ckpt”)
print "Model saved in file: ", save_path

3、初始化
此处使用 tf.initialize_all_variables() 用于初始化变量。但是这句话仍然不会立即执行。需要通过sess来将数据流动起来 。
例子

Create two variables.

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name=“weights”)
biases = tf.Variable(tf.zeros([200]), name=“biases”)

Add an op to initialize the variables.

init_op = tf.initialize_all_variables()

Later, when launching the model

with tf.Session() as sess:

Run the init operation.

sess.run(init_op)

Use the model

4、实例讲解
例子
#--coding:UTF-8--
import tensorflow as tf

state = tf.Variable(0 , name=‘counter’)
one = tf.constant(1)

new_value = tf.add(state,one)
update = tf.assign(state,new_value)

init = tf.initialize_all_variables()

with tf.Session() as sess:
sess.run(init)
for _ in range(3):
sess.run(update)
print(sess.run(state))

#–coding:UTF-8–
这句话是指定*.py的编码方式,如果文件中涉及到中文汉字的话,有必要写一下这句话。当然也可以这样写:encoding:UTF-8
import tensorflow as tf
这句话是导入tensorflow 模块
state = tf.Variable(0 , name=‘counter’)
使用tensorflow在默认的图中创建节点,这个节点是一个变量。
one = tf.constant(1)
此处调用了td的一个函数,用于创建常量。
new_value = tf.add(state,one)
对常量与变量进行简单的加法操作,这点需要说明的是: 在TensoorFlow中,所有的操作op,变量都视为节点,tf.add() 的意思就是在tf的默认图中添加一个op,这个op是用来做加法操作的。
update = tf.assign(state,new_value)
这个操作是:赋值操作。将new_value的值赋值给update变量。
在这里,需要再次说明:我们此时只是定义好了图,并没有变量并没有初始化。目前只有state的值是1。
init = tf.initialize_all_variables()
此处用于初始化变量。但是这句话仍然不会立即执行。需要通过sess来将数据流动起来 。
切记:所有的运算都应在在session中进行:
with tf.Session() as sess:
此处自动开启一个session
sess.run(init)
对变量进行初始化,执行(run)init语句
for _ in range(3):
sess.run(update)
print(sess.run(state))

循环3次,并且打印输出。

作者:liumw1203
链接:https://www.jianshu.com/p/2b9e475391ab
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

<think>好的,我现在需要回答用户关于TensorFlow中矩阵乘法操作和变量定义用途的问题。首先,我需要回顾用户提供的引用内容,并结合之前的回答来构建一个详细的解释。 用户提到引用[1]中的代码示例,展示了如何使用tf.constant定义矩阵,并进行乘法和加法操作,还计算了矩阵的行列式。这帮助我理解用户希望了解矩阵乘法的具体实现方式以及变量的定义。引用[3]提到变量用于存储模型参数,如神经网络的权重,这提示变量在模型训练中的重要性,比如在训练过程中更新权重。 接下来,我需要结合之前的回答,其中详细讲解了TensorFlow的核心架构,包括计算图、自动微分、分布式训练等。特别是计算图部分,矩阵乘法和变量定义都属于计算图中的节点,因此在回答时需要强调静态计算图和动态计算图的区别,以及变量在其中的作用。 用户的问题有两个部分:矩阵乘法的操作和变量定义的用途。我需要分别解释这两个部分,并给出代码示例。首先,矩阵乘法在TensorFlow中通常使用tf.matmul函数,而变量则通过tf.Variable定义,用于在训练过程中更新参数。 需要注意的是,用户提供的引用[1]中的代码使用了TensorFlow 1.x的Session运行方式,而当前推荐使用TensorFlow 2.x的即时执行模式。因此,在回答时应该对比这两种方式,说明不同版本中的差异和最佳实践。 关于变量定义的用途,引用[3]明确指出变量用于存储模型参数,如神经网络的权重,并且在训练过程中通过反向传播更新这些变量。因此,我需要强调变量在模型训练中的持久性和可训练性,与常量的区别。 此外,用户可能对矩阵乘法的应用场景感兴趣,比如在神经网络中的全连接层或卷积层中的应用,可以简要提及这些应用以增强回答的实用性。 最后,需要确保回答结构清晰,分点说明,并附上代码示例和注意事项,帮助用户理解并正确使用相关功能。</think>### TensorFlow矩阵乘法操作与变量定义详解 --- #### 一、矩阵乘法操作 TensorFlow通过`tf.matmul`函数实现矩阵乘法,严格遵循数学矩阵乘法规则(即行列对应相乘后累加)。其核心特性如下: 1. **基本语法与限制** ```python result = tf.matmul(a, b) # a的列数必须等于b的行数 ``` - 输入必须为**2D张量**(矩阵),支持动态形状(Dynamic Shape)和静态形状(Static Shape)检查[^1]。 - 若输入为更高维张量(如批量矩阵),将执行批量矩阵乘法(Batch MatMul)。 2. **静态计算图模式(TensorFlow 1.x)** ```python import tensorflow as tf # 定义常量矩阵 matrix1 = tf.constant([[2,2,2],[2,2,2],[2,2,2]], dtype=tf.int32) # 3x3 matrix2 = tf.constant([[1,1,1],[1,1,1],[1,1,1]], dtype=tf.int32) # 3x3 # 构建计算图节点 product = tf.matmul(matrix1, matrix2) # 执行计算 with tf.Session() as sess: print(sess.run(product)) # 输出[[6,6,6],[6,6,6],[6,6,6]] ``` - **特点**:需显式创建会话(Session)执行计算图[^1]。 3. **动态图模式(TensorFlow 2.x Eager Execution)** ```python matrix1 = tf.constant([[2,2,2],[2,2,2],[2,2,2]], dtype=tf.int32) matrix2 = tf.constant([[1,1,1],[1,1,1],[1,1,1]], dtype=tf.int32) print(tf.matmul(matrix1, matrix2)) # 直接输出结果 ``` - **优势**:无需会话管理,支持即时调试[^3]。 4. **广播机制(Broadcasting)** - 当输入维度不匹配但可广播时自动扩展维度: ```python a = tf.ones([2,3]) # 2x3 b = tf.ones([3,5]) # 3x5 c = tf.matmul(a, b) # 结果形状为2x5 ``` --- #### 二、变量(Variable)的定义与核心用途 TensorFlow变量用于存储**模型参数**,在训练过程中通过反向传播持续更新。与常量(Constant)的关键区别在于**可修改性**。 1. **变量定义方法** ```python # 初始化为全1矩阵 weights = tf.Variable(tf.ones(shape=(3,3)), dtype=tf.float32, name="weights") # 显式初始化(旧版本需要) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) ``` 2. **核心特性** - **持久化存储**:变量值在会话之间保持(通过`tf.train.Saver`保存/加载模型)。 - **自动微分支持**:变量梯度在反向传播中自动计算。 - **设备分配**:可指定变量存放于CPU/GPU(如`with tf.device('/GPU:0'):`)。 3. **典型应用场景** - **神经网络权重存储** ```python # 全连接层权重定义 W = tf.Variable(tf.random.normal([input_dim, output_dim]), name="weight") b = tf.Variable(tf.zeros([output_dim]), name="bias") ``` - **训练计数器** ```python global_step = tf.Variable(0, trainable=False, name="global_step") optimizer = tf.keras.optimizers.Adam() optimizer.apply_gradients(zip(gradients, model.trainable_variables), global_step) ``` 4. **变量与常量的对比** | 特性 | 变量(Variable) | 常量(Constant) | |---------------------|------------------------|------------------------| | **值可修改性** | ✔️(通过assign方法) | ❌ | | **梯度计算** | ✔️ | ❌ | | **内存占用** | 长期占用 | 临时占用 | | **典型用途** | 模型参数 | 固定输入数据 | --- #### 三、混合编程示例(矩阵乘法与变量更新) ```python import tensorflow as tf # 定义可训练变量 W = tf.Variable([[0.5, 0.2], [0.3, 0.8]], dtype=tf.float32) # 2x2 x = tf.constant([[1.0, 2.0], [3.0, 4.0]], dtype=tf.float32) # 2x2 # 前向计算 y_pred = tf.matmul(x, W) loss = tf.reduce_sum(tf.square(y_pred - [[1.0, 1.0], [1.0, 1.0]])) # 自动微分与变量更新 optimizer = tf.keras.optimizers.SGD(learning_rate=0.01) with tf.GradientTape() as tape: current_loss = loss gradients = tape.gradient(current_loss, [W]) optimizer.apply_gradients(zip(gradients, [W])) print("更新后的权重:", W.numpy()) ``` --- ### 关键注意事项 1. **变量初始化** TensorFlow 2.x中变量在首次使用时自动初始化,但复杂初始化逻辑仍需手动控制。 2. **设备一致性** 确保参与运算的张量与变量位于同一设备(CPU/GPU),否则会触发`InvalidArgumentError`。 3. **矩阵形状匹配** 使用`tf.debugging.assert_shapes`验证矩阵维度: ```python tf.debugging.assert_shapes([(W, ('in_dim', 'out_dim')), (x, (None, 'in_dim'))]) ``` --- ### 相关问题 1. TensorFlow中如何实现稀疏矩阵乘法以优化内存? 2. 变量与ResourceVariable在分布式训练中有何区别? 3. 如何利用`tf.GradientTape`监控自定义变量的梯度变化? 4. TensorFlow 2.x中如何将动态图代码转换为静态图以提升性能? 5. 矩阵乘法与逐元素乘法(`tf.multiply`)在神经网络中的不同应用场景?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值