TensorFlow 里的线性函数
神经网络中最常见的运算,就是计算输入、权重和偏差的线性组合。回忆一下,我们可以把线性运算的输出写成:TensorFlow 里的权重和偏差
训练神经网络的目的是更新权重和偏差来更好地预测目标。为了使用权重和偏差,你需要一个能修改的 Tensor。这就排除了 tf.placeholder()
和 tf.constant()
,因为它们的 Tensor 不能改变。这里就需要 tf.Variable
了。
tf.Variable()
x = tf.Variable(5)
tf.Variable
类创建一个 tensor,其初始值可以被改变,就像普通的 Python 变量一样。该 tensor 把它的状态存在 session 里,所以你必须手动初始化它的状态。你将使用 tf.global_variables_initializer()
函数来初始化所有可变 tensor。
初始化
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()
函数返回一个都是 0 的 tensor。
TensorFlow Softmax
Softmax 函数可以把它的输入,通常被称为 logits 或者 logit scores,处理成 0 到 1 之间,并且能够把输出归一化到和为 1。这意味着 softmax 函数与分类的概率分布等价。它是一个网络预测多分类问题的最佳输出激活函数。
TensorFlow Softmax
当我们用 TensorFlow 来构建一个神经网络时,相应地,它有一个计算 softmax 的函数。
x = tf.nn.softmax([2.0, 1.0, 0.2])
就是这么简单,tf.nn.softmax()
直接为你实现了 softmax 函数,它输入 logits,返回 softmax 激活函数。
# Solution is available in the other "solution.py" tab
import tensorflow as tf
def run():
output = None
logit_data = [2.0, 1.0, 0.1]
logits = tf.placeholder(tf.float32)
# TODO: Calculate the softmax of the logits
softmax = tf.nn.softmax(logits)
with tf.Session() as sess:
# TODO: Feed in the logit data
output = sess.run(softmax,feed_dict={logits:logit_data})
return output
TensorFlow 中的交叉熵(Cross Entropy)
与 softmax 一样,TensorFlow 也有一个函数可以方便地帮我们实现交叉熵。
让我们把你从视频当中学到的知识,在 TensorFlow 中来创建一个交叉熵函数。创建一个交叉熵函数,你需要用到这两个新的函数:
Reduce Sum
x = tf.reduce_sum([1, 2, 3, 4, 5]) # 15
tf.reduce_sum()
函数输入一个序列,返回它们的和
Natural Log
x = tf.log(100) # 4.60517
tf.log()
所做跟你所想的一样,它返回所输入值的自然对数。
练习
用 softmax_data
和 one_hot_encod_label
打印交叉熵
# Solution is available in the other "solution.py" tab
import tensorflow as tf
softmax_data = [0.7, 0.2, 0.1]
one_hot_data = [1.0, 0.0, 0.0]
softmax = tf.placeholder(tf.float32)
one_hot = tf.placeholder(tf.float32)
# TODO: Print cross entropy from session
cross_entropy = -tf.reduce_sum(tf.multiply(one_hot, tf.log(softmax)))
with tf.Session() as sess:
print(sess.run(cross_entropy, feed_dict={softmax: softmax_data, one_hot: one_hot_data}))