Tensorflow介绍
1. Tensor
在 Tensorflow 中,数据并没有作为整数、浮点数或字符串储存。这些值被封装到了一个被称为 tensor 的对象中。Tensors 有不同的大小:
# A is a 0-dimensional int32 tensor
A = tf.constant(1234)
# B is a 1-dimensional int32 tensor
B = tf.constant([123,456,789])
# C is a 2-dimensional int32 tensor
C = tf.constant([ [123,456,789], [222,333,444] ])
通过 tf.constant() 返回的 tensor 被称为 constant tensor,因为 tensor 的值从不改变。
一个 “TensorFlow Session” ,是一个运行以上 graph 的环境。session
负责将操作分配给GPU和/或CPU,包括远程机器。示例代码如下:
import tensorflow as tf
# Create TensorFlow object called hello_constant
hello_constant = tf.constant('Hello World!') # 创建 tensor
with tf.Session() as sess: # 使用 tf.Session() 创建一个叫做 sess 的 session 实例
# Run the tf.constant operation in the session
output = sess.run(hello_constant) # 评估 session 并返回结果
print(output)
1.1 tf.placeholder()
在 tensorflow 中没有办法直接设置 x x x 到数据集中,因为随着时间的推移,你会希望你的TensorFlow 模型接受不同的数据集与不同的参数。此时引入了 tf.placeholder () 。
tf.placeholder () 返回一个 tensor,它从传递给 tf.session.run()
函数的数据中获得它的值,允许 session 运行之前设置输入。
在 tf.session.run()
内使用参数 feed_dict 来设置 placeholder tensor,不仅仅可以只设置一个值,还可以同时设置多个:
x = tf.placeholder(tf.string)
y = tf.placeholder(tf.int32)
z = tf.placeholder(tf.float32)
with tf.Session() as sess:
output = sess.run(x, feed_dict={x: 'Hello World'})
output = sess.run(x, feed_dict={x: 'Test String', y: 123, z: 45.67})
1.2 TensorFlow Math
1.2.1 加法
x = tf.add(5, 2) # 7
返回和作为 tensor
1.2.2 减法和乘法
x = tf.subtract(10, 4) # 6
y = tf.multiply(2, 5) # 10
1.2.3 类型转换
可能需要在类型之间进行转换,以使某些操作符协同工作。如下面语句会导致出错:
tf.subtract(tf.constant(2.0),tf.constant(1)) # Fails with ValueError: Tensor conversion requested dtype float32 for Tensor with dtype int32:
这里是因为 1
是一个整数而常量 2.0
是一个浮点数,在做 subtract
时希望它们类型相符。
可以选择的一种方式是,在做 subtract
前,转换 2.0
为整数:
tf.subtract(tf.cast(tf.constant(2.0), tf.int32), tf.constant(1)) # 1
2. 多项式逻辑回归分类法(multionmial logistic classification)
逻辑分类器就是所谓的线性分类器,它将比如图像的像素作为输入,对其应用线性函数,来生成预测。线性函数就是一个巨大的矩阵乘法器,它将所有输入作为一个大的向量,用
X
X
X 表示,然后将它们与一个矩阵相乘,来生成预测,每个输出类一个。在整个过程中,我们用
X
X
X 表示输入,
W
W
W 表示权重,
b
b
b 表示偏差项。矩阵的权重和偏差需要用到机器学习来计算,训练模型意味着我们将尝试找出一些值,能很好预测结果的权重和偏差值。那么如何使用得分来执行分类呢,作为输入的每幅图像,有且仅有一个标签,我们要将这些得分转换成概率,让正确类的概率尽可能接近1,而其他各类的概率接近于 0。
将得分转换成概率的方法,就是运用一个 Softmax 函数,在这里用
S
S
S 表示它的样子。这些概率的总和为 1,当原始得分较大时,概率值就较大;得分较小时则小。得分,在逻辑回归中,通常被称为
LOGITS
。
2.1 过程小结
- 输入数据通过一个线性模型运算后,将被转换为对数几率。
- 这些对数几率,也就是得分,可以通过 softmax 方法转化为概率。
- 紧接着通过交叉熵方法去比较,输出的概率向量与经过 One-hot Coding 的标签向量的差异
2.2 交叉熵计算方式
2.3 最小化交叉熵
最小化交叉熵,也就是说,要使之对正确分类距离要足够小,对错误分类的距离足够大。可以通过以下公式来衡量,求出对所有训练集样本和所有现有标签的距离之和,这个和被称为训练损失函数:
£
=
1
N
∑
i
D
(
S
(
w
x
i
+
b
)
,
L
i
)
£=\frac{1}{N} \sum_{i} D\left(S\left(w x_{i}+b\right), L_{i}\right)
£=N1i∑D(S(wxi+b),Li)
训练集中的每个样本,都将被乘上巨大的 W W W 矩阵,并且它们都将被加起来,得到巨大的和。我们希望每一个距离值都很小,也就是说,分类器能够对训练集中的每个样本都能很好地分类,我们希望这个训练损失函数值很小
2.4 归一化输入
在计算时,把一个非常小的值加到一个非常大的值上会导致很多错误,我们希望,这一巨大误差函数所涉及的值,不要太大也不要太小。一个较好的指导原则就是,使变量尽可能保持0均值,和相同的方差,即:
μ
(
x
i
)
=
0
σ
(
X
i
)
=
σ
(
X
j
)
\mu(x_i)=0\\\sigma(X_i)=\sigma(X_j)
μ(xi)=0σ(Xi)=σ(Xj)