激活函数、损失函数、学习率

先介绍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))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容