TensorFlow入门-04.TensorFlow变量与神经网络参数

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中的随机数生成函数

TensorFlow随机数生成函数
函数名称随机数分布主要参数
if.random_normal正态分布平均值、标准差、取值类型
tf.truncated_normal正态分布、但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机平均值、标准差、取值类型
tf.random_uniform均匀分布最小值、最大值、取值类型
tf.random_gammaGamma分布形状参数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].

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值