TensorFlow 里的线性函数
神经网络中最常见的运算,就是计算输入,权重和偏差的线性组合。回忆一下,我们可以把线性操作的输入写成:
这里 W 是连接两层的权重矩阵。输出 y ,输入 x, 偏差 b 全部都是向量。
TensorFlow 里的权重和偏差
训练神经网络的目的是更新权重和偏差来更好的预测目标。为了使用权重和偏差,你需要一个能修改的 Tensor 。这就排除了tf.placeholder()
和 tf.constant()
因为他们的 Tensors 不能改变。这里就需要 tf.Variable
了。
tf.Variable()
x = tf.Variable(5)
tf.Variable
类创建一个 tensor,它的初始值可以被改变,就像普通的 Python 变量一样。tensor 把它的状态存在 session里,所以你必须手动初始化它的状态。你用tf.global_variables_initializer()
来初始化所有可变 tensors。
初始化
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
tf.global_variables_initializer()
会返回一个操作,它会从graph中初始化所有的 TensorFlow 变量。你可以通过 session 来呼叫这个操作来初始化所有上面的变量。用 tf.Variable
类可以让我们改变权重和偏差,但还是要选择一个初始值。
从正态分布中初始化权重是个好习惯。随机化权重可以避免每次训练时候模型卡在同一个地方。在下节学习梯度下降的时候,你会学到更多。
类似地,从正态分布中选择权重可以避免任意一个权重与其他权重相比有压倒性的特性。你可以用 tf.truncated_normal()
函数从一个正态分布中产生随机数。
tf.truncated_normal()
n_features = 120
n_labels = 5
weights = tf.Variable(tf.truncated_normal((n_features, n_labels)))
tf.truncated_normal()
返回一个 tensor,它的随机值取自一个正态分布,并且它们的取值会在这个正态分布平均值的两个标准差之内。
因为权重已经被随机化来帮助模型不被卡住,你不需要再把偏差随机化了。让我们简单地把偏差设为 0。
tf.zeros()
n_labels = 5
bias = tf.Variable(tf.zeros(n_labels))
tf.zeros()
function 返回一个都是 0 的 tensor。