0.TensorFlow中的变量
|- 函数介绍:
|- tf.Variable:TensorFlow中的变量声明函数
|- tf.random_normal:
|- TensorFlow中的随机数(正态分布)矩阵生成函数
|- 例子:tf.random_normal([行数, 列数], stddev=标准差, mean=均值) (均值可以省略,默认值为0)
|- 实例:声明一个矩阵变量
weights = tf.Variable(tf.random_normal([2, 3], stddev=2))
|- 该矩阵变量为一个2x3的随机数矩阵
|- 这些随机数的均值为0,标准差为2.
1.通过随机数来创建变量
TensorFlow中的随机数生成函数
函数名称 | 随机数分布 | 主要参数 |
if.random_normal | 正态分布 | 平均值、标准差、取值类型 |
tf.truncated_normal | 正态分布、但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机 | 平均值、标准差、取值类型 |
tf.random_uniform | 均匀分布 | 最小值、最大值、取值类型 |
tf.random_gamma | Gamma分布 | 形状参数alpha、尺度参数beta、取值类型 |
2.通过常数来创建变量
常用常量声明方法
函数名称 | 功能 | 样例 |
tf.zeros | 产生全0数组 | tf.zeros([2, 3], int32) -> [[0, 0, 0], [0, 0, 0]] |
tf.ones | 产生全1数组 | tf.ones([2, 3], int32) -> [[1, 1, 1], [1, 1, 1]] |
tf.fill | 产生全部为给定数字的数组 | tf.fill([2, 3], 9) -> [[9, 9, 9], [9, 9, 9]] |
tf.constant | 产生一个给定值的常量 | tf.constant([1, 2, 3]) -> [1, 2, 3] |
|- 用例:在神经网络中,偏置项(bias)通常会使用常数来设置初始值。
biases = tf.Variable(tf.zeros([3]))
以上代码将生成一个名为“biases”的变量,它的内容是一个 “一行3列的全0矩阵”:[0, 0, 0]
3.通过其他变量来创建变量
weights = tf.Variable(tf.random_normal([2, 3], stddev=2)) # 通过随机数创建变量
w2 = tf.Variable(weights.initialized_value()) # 通过已有变量“weights”创建变量
w3 = tf.Variable(weights.initialized_value() * 2.0) # 通过已有变量“weights”创建变量
4.变量的初始化
变量在使用之前还需要对其进行初始化。
sess.run(weights.initializer) # 初始化weighs
sess.run(w2.initializer) # 初始化w2
sess.run(w3.initializer) # 初始化w3
5.完整样例
通过变量实现神经网络的参数并实现前向传播。
# 1.导入模块
import tensorflow as tf
# 2.声明变量
# 声明w1,w2随机数矩阵变量,标准差为1,种子为1(在函数tf.random_normal()中,可以设置“seed”(种子)用来保证每次运行得到一样的结果)
w1 = tf.Variable(tf.random_normal((2, 3), stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal((3, 1), stddev=1, seed=1))
# 3.创建特征向量
# 暂时将输入的特征向量定义为一个常量。这里的x是一个1x2的矩阵。
x = tf.constant([[0.7, 0.9]])
# 4.定义计算
# 通过前向传播算法获得神经网络的输出
a = tf.matmul(x, w1) # 特征矩阵 * 第一层权重矩阵
y = tf.matmul(a, w2) # 第一隐藏层的输出矩阵 * 第二层权重矩阵
# 5.创建会话
sess = tf.Session()
# 6.在会话中初始化变量
sess.run(w1.initializer) # 初始化变量w1
sess.run(w2.initializer) # 初始化变量w2
# 7.执行计算并输出结果
print(sess.run(y))
# 8.关闭会话
sess.close()
6.在会话中对变量做统一初始化
init_op = tf.global_variables_initializer()
sess.run(init_op)
7.变量操作实现细节
前向传播样例中的变量w1的操作细节
random_n... -> Assign -> w1 -> read -> MatMul
随机数生成 -> Assign函数 -> 产生w1变量 -> read函数 -> MatMul函数
8.集合(collection)
所有的变量都会被自动地加入到GraphKeys.VARIABLES这个集合中。
获取当前计算图上的所有变量
|- 函数:tf.global_variables()
|- 作用:拿到当前计算图上的所有变量,这有助于持久化整个计算图的运行状态。
9.需要优化的参数和其他参数
在构建机器学习模型,比如神经网络时,可以通过变量声明函数中的trainable参数来区分需要优化的参数(比如神经网络中的参数)和其他参数(比如迭代轮数)。
|- 当trainable为True:该参数为需要优化的参数。该变量声明之后会被加入到GraphKeys.TRAINABLE_VARIABLES集合。
|- 获取所有需要优化的参数:tf.trainable_variables
|- TensorFlow中提供的神经网络优化算法会将GraphKeys.TRAINABLE_VARIABLES集合中的变量作为默认的优化对象。
|- 当trainable为False:该参数是其他参数。
10.变量的维度(shape)和类型(type)
变量是张量的其中一种,所以变量也有维度和类型。
函数介绍:
|- 赋值函数assign():tf.assign(w1, w2) 《==等价于==》w1.assign( w2),意思是:将w2的值赋值给w1。
10.1 变量的类型不可改变
|- 变量的类型是不能改变的:一个变量在构建之后,它的类型就不能再被改变。
|- random_normal的返回值类型默认为:tf.float32。
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 3],dtype=tf.float64, stddev=1), name="w2")
w1.assign(w2)
|- 由于w1的数据类型是默认的tf.float32而w2是指定的tf.float64,所以语句“w1.assign(w2)”在执行时会报错。
10.2 变量的维度可以改变
|- 将参数置否validate_shape=False,维度可以修改。
import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 2], stddev=1), name="w2")
tf.assign(w1, w2, validate_shape=False) # 当参数的数量大于两个时,需要用tf.的方式调用。
若不设置,则会报错:
import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 2], stddev=1), name="w2")
w1.assign(w2) # 等价于:tf.assign(w1, w2)
# 报错:
ValueError: Dimension 1 in both shapes must be equal, but are 3 and 2 for 'Assign' (op: 'Assign') with input shapes: [2,3], [2,2].