先介绍tensorflow中神经网络的几个概念
1.激活函数
常用记过函数包括:
tf.nn.relu()
tf.nn.sigmoid()
tf.nn.tanh()
2.NN复杂度
神经网络的复杂度通常用NN层数和NN参数的个数表示
网络层数 = 隐藏层层数 + 输出层(不包括输入层)
总参数 = 总W + 总b
对于一个3-4-2的全连接神经网络,其参数个数为:(3×4+4) + (4×2+2) = 26
3.损失函数
神经网络的优化目标:Loss最小,主要包括以下三种:
(1)mse(2)自定义(3)ce(Cross Entropy)
(1)均方根误差
loss_mse = tf.reduce_mean(tf.square(y-y_))
(2)自定义误差
loss = tf.reduce_sum(tf.where(tf.greater(y,y_),cost*(y-y_),profit*(y_-y)))
(3)交叉熵误差
表征两个概率分布之间的距离,为了满足概率分布,当tf.log()的输入大于1.0时为1.0,小于1e-12时为1e-12.
ce = tf.reduce_mean(y_*tf.log(clip_by_value(y,1e-12,1.0)))
当n分类的n个输出(y1...yn)通过softmax()函数便满足了概率分布的要求:
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))
cem = tf.reduce_mean(ce)
4.学习率learning_rate
参数更新幅度:Wn+1 = Wn - learning_rate
指数衰减学习率
global_step = tf.Variable(0,trainble=False)
learning_rate = tf.train.exponetial_decay(
LEARN_RATE_BASE, #初始学习率
global_step, #运行了多少轮batch_size
LEARNING_RATE_STEP, #经过多少个epoch更新一次学习率 = 样本总数/BATCH_SIZE
LEARNING_RATE_DECAY, #学习率衰减率(0,1)
staircase=True) #平滑衰减
完整代码如下:
import tensorflow as tf
LEARNING_RATE_BASE = 0.1 #最初学习率
LEARNING_RATE_DECAY = 0.99
LEARNING_RATE_STEP = 1 #喂入多少个batch_size后,更新一次学习率,一般设为:样本总数/BATCH_SIZE
#运行了几轮batch_size的计数器,初值为0,设为不被训练
global_step = tf.Variable(0,trainable=False)
# 定义指数下降学习率
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE,
global_step,
LEARNING_RATE_STEP,
LEARNING_RATE_DECAY,
staircase=True)
# 定义待优化参数
w = tf.Variable(tf.constant(5,dtype=tf.float32))
# 定义损失函数
loss = tf.square(w+1)
# 定义反向传播方法
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
for i in range(40):
sess.run(train_step)
w_val = sess.run(w)
loss_val = sess.run(loss)
learning_rate_val = sess.run(learning_rate)
print('after %s step: w if %f, loss is: %f, learning_rate is: %f.'%(i,w_val,loss_val,learning_rate_val))