1. tensor张量, graph图, session会话
1.1 tensor张量
定义:多维数组(阶=维数)
维数/ 阶 | 类别 | 实例 |
---|---|---|
0 | 标量 | m = 1 |
1 | 向量 | m = [1, 2] |
2 | 矩阵 | m = [[1, 2], [3, 4]] |
n | 张量 | m = [[[… |
1.2 graph图
定义:搭建神经网络的计算过程,只搭建,不运算
比如,对于
y
=
x
W
=
x
1
∗
w
1
+
x
2
∗
w
1
y = xW = x1 * w1 + x2 * w1
y=xW=x1∗w1+x2∗w1
搭建的计算图:
如果print y
, 输出的结果为张量的属性,而非计算结果!
Tensor(“matmul:0”,shape(1,),dtype=float32)
属性含义分别是:“节点名:第0个输出“,张量的维度(此处为一维标量),数据类型
1.3 session会话
定义:执行计算图中的节点运算
语法:
with tf.Session() as sess:
print sess.run(y)
使用会话进行节点运算之后,就可以print出每一个节点具体的计算数值。
2. 前向传播
2.1 变量初始化
w = tf.variable(method) // 对于权重,偏置等参数的初始化
x = tf.placeholder(data_type, shape) // 对于输入数据的初始化,见2.2章节
- 随机方法
常见的随机数获取方法有如下几种
·tf.random_normal(shape, stddev, mean, seed)
正态分布
设置随机数种子seed,则每一次获取随机数相同;否则不同
·tf.random_uniform(shape)
平均分布
·tf.truncated_normal(shape)
去掉偏离中心过大点的正态分布 - 定值方法
·tf.zeros(shape, data_type)
全0
·tf.ones(shape, data_type)
全1
·tf.fill(shape, constant)
全定值数组
用constant填充张量 e.g.tf.fill([1,2],4)
生成[[4],[4]]
·tf.constant(tensor)
直接给值
-
权重矩阵W的维度确定
如果y = tf.matmul(x, W)
W s h a p e = ( 前 节 点 个 数 , 后 节 点 个 数 ) W_{shape} = (前节点个数,后节点个数) Wshape=(前节点个数,后节点个数) -
以上初始化定义后,要在会话中标明“运行初始化”,才可以起效果。
init_op = tf.global_variables_initializer()
sess.run(init_op)
2.2 传入训练数据
在搭建好神经网络后,要把真实的训练数据传入网络。对于批量喂入数据,可以先用tf.placeholder
占位,目的是规定 1. 输入多少组数据;2. 训练数据的特征维度。 再喂入真实数据集,得到输出。
x = tf.placeholder(data_type,shape=(None,2))
sess.run(y, feed_dict)
其中,shape
的第一个参数为数据组数,如果喂入多组数据,那么用None
表示;第二个参数为特征维度,比如一个人有性格和年龄两个特征。
3. 反向传播
反向传播的目的是使模型在训练数据上达到损失函数(loss function)最小。
- 损失函数
定义:衡量预测值与真实值之间的差距
常见衡量方式:
· 均方误差MSE
// y_ : 真实值; y: 预测值
loss = tf.reduce_mean(tf.square(y_ - y))
· 交叉熵 cross entropy
定义:表示两个概率分布之间的距离。交叉熵越大,概率分布越远;越小,概率分布越近。
H
(
y
′
,
y
)
=
−
∑
y
′
∗
l
o
g
y
H(y', y) = -\sum{y' * logy}
H(y′,y)=−∑y′∗logy
其中,y’ 为真实值,y为预测值。
为了保证预测结果满足概率分布,即
∀
x
P
(
X
=
x
)
∈
[
0
,
1
]
a
n
d
∑
P
(
X
=
x
)
=
1
\forall x \space P(X=x)\in[0,1] \space and \space \sum{P(X=x)} = 1
∀x P(X=x)∈[0,1] and ∑P(X=x)=1
,可以用softmax函数处理分类输出。
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argsmax(y_,1))
cem = tf.reduce_mean(ce)
- 反向传播方法(优化算法)
语法:
// 方法1 : 梯度下降
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
// 方法2 : 动量算法(使梯度下降更加平稳)
train_step = tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
// 方法3 : Adam (参数比较平稳)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
4. 优化过程
4.1 学习率
常见的学习率更新方式:指数衰减 exponential decay
L
e
a
r
n
i
n
g
_
r
a
t
e
=
i
n
i
t
i
a
l
_
l
e
a
r
n
i
n
g
_
r
a
t
e
∗
l
e
a
r
n
i
n
g
_
r
a
t
e
_
d
e
c
a
y
g
l
o
b
a
l
_
s
t
e
p
l
e
a
r
n
i
n
g
_
r
a
t
e
_
s
t
e
p
Learning\_rate = initial\_learning\_rate * learning\_rate\_decay^{\frac{global\_step}{learning\_rate\_step}}
Learning_rate=initial_learning_rate∗learning_rate_decaylearning_rate_stepglobal_step
其中,global_step
表示运行了几轮batch_size, learning_rate_step
表示多少轮更新一次学习率,一般为( 总样本数/batch_size).
语法:
global_step = tf.variable(0,trainable=false)
learning_rate = tf.train.exponential_decay(initial_learning_rate, global_step, learning_rate_step, learning_rate_decay,staircase)
4.2 正则化
正则化在损失函数中引入模型复杂度指标,一般给权重W加权,弱化了训练数据的噪声,防止模型过拟合数据。