zoukankan      html  css  js  c++  java
  • Tensorflow 损失函数及学习率的四种改变形式

    Reference: https://blog.csdn.net/marsjhao/article/details/72630147

    分类问题损失函数-交叉熵(crossentropy)

            交叉熵描述的是两个概率分布之间的距离,分类中广泛使用的损失函数,公式如下     

            在网络中可以通过Softmax回归将前向传播得到的结果变为交叉熵要求的概率分数值。Tensorflow中,Softmax回归的参数被去掉,通过一层将神经网络的输出变为一个概率分布。

    代码实现

    import tensorflow as tf
     
    y_ = tf.constant([[1.0, 0, 0]]) # 正确标签
    y1 = tf.constant([[0.9, 0.06, 0.04]]) # 预测结果1
    y2 = tf.constant([[0.5, 0.3, 0.2]]) # 预测结果2
    # 以下为未经过Softmax处理的类别得分
    y3 = tf.constant([[10.0, 3.0, 2.0]])
    y4 = tf.constant([[5.0, 3.0, 1.0]])
     
    # 自定义交叉熵
    cross_entropy1 = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y1, 1e-10, 1.0)))
    #tf.clip_by_value 将一个tensor元素数值限制在指定范围内,防止一些错误,起到数值检查作用。
    cross_entropy2 = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y2, 1e-10, 1.0)))
    # TensorFlow提供的集成交叉熵
    # 注:该操作应该施加在未经过Softmax处理的logits上,否则会产生错误结果
    # labels为期望输出,且必须采用labels=y_, logits=y的形式将参数传入
    cross_entropy_v2_1 = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y3)
    cross_entropy_v2_2 = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y4)
     
    sess = tf.InteractiveSession()
    print('[[0.9, 0.06, 0.04]]:', cross_entropy1.eval())
    print('[[0.5, 0.3, 0.2]]:', cross_entropy2.eval())
    print('v2_1', cross_entropy_v2_1.eval())
    print('v2_2',cross_entropy_v2_2.eval())
    sess.close()
     
    '''
    [[0.9, 0.06, 0.04]]: 0.0351202
    [[0.5, 0.3, 0.2]]: 0.231049
    v2_1 [ 0.00124651]
    v2_2 [ 0.1429317]
    '''

    回归问题损失函数-均方误差(MSE,mean squared error)

           均方误差也可以用于分类问题的损失函数,

               

    自定义损失函数

            对于如下自定义损失函数的Tensorflow实现

              loss= tf.reduce_sum(tf.where(tf.greater(y, y_), (y-y_)*loss_more,(y_-y)*loss_less))

               tf.greater(x,y),返回x>y判断结果的bool型tensor。 tf.where(condition,x=None,y=None,name=None)根据condition选择x或者y。

    代码实现

    import tensorflow as tf
    from numpy.random import RandomState
     
    batch_size = 8
    x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
    y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
     
    w1 = tf.Variable(tf.random_normal([2,1], stddev=1, seed=1))
    y = tf.matmul(x, w1)
     
    # 根据实际情况自定义损失函数
    loss_less = 10
    loss_more = 1
    # tf.select()在1.0以后版本中已删除,tf.where()替代
    loss = tf.reduce_sum(tf.where(tf.greater(y, y_),
                                   (y-y_)*loss_more, (y_-y)*loss_less))
    train_step = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
     
    rdm = RandomState(seed=1) # 定义一个随机数生成器并设定随机种子
    dataset_size = 128
    X = rdm.rand(dataset_size, 2)
    Y = [[x1 + x2 +rdm.rand()/10.0 - 0.05] for (x1, x2) in X] # 增加一个-0.05~0.05的噪声
     
    sess = tf.InteractiveSession()
    tf.global_variables_initializer().run()
    for i in range(5000):
        start = (i * batch_size) % dataset_size
        end = min(start+batch_size, dataset_size)
        train_step.run({x: X[start: end], y_: Y[start: end]})
        if i % 500 == 0:
            print('step%d:
    ' % i, w1.eval())
    print('final w1:
    ', w1.eval())
    sess.close()
     
    '''
    loss_less = 10
    loss_more = 1
    final w1:
     [[ 1.01934695]
     [ 1.04280889]]
    loss_less = 1
    loss_more = 10
    final w1:
     [[ 0.95525807]
     [ 0.9813394 ]]
    loss_less = 1
    loss_more = 1
    final w1:
     [[ 0.9846065 ]
     [ 1.01486754]]
    '''

    Tensorflow 的Cross_Entropy实现

          1. tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,dim=-1,name=Node)

              作用:自动计算logits(未经过Softmax)与labels 之间的cross_entropy交叉熵。logits 为神经网络最后一层的输出,有batch的话,大小为[batchsize,num_classes],单样本的话就是num_classes。labels:为ground Truth大小同上。labels的每一行为one-hot表示。

         2.tf.nn.sparse_softmax_cross_entropy_with_logits()

             输入的logits是未经缩放的,函数内部对logits进行一个softmax操作。返回值为一个向量,求交叉熵做一步tf.reduce_sum操作,求loss,进一步做tf.reduce_mean,对向量求均值。

        3.tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,name=None)

        4.tf.nn.weithted_cross_entropy_with_logits(targets,logits,pos_weith,name=None)

    学习率的四种改变形式:

           1.fixed:learning rate 固定不变

           2.Step:在每次迭代stepsize次后,减少gmma倍。lr = lr x gamma

           3. polynomial: 呈多项式曲线下降,lr = base_lr x(t/T)^power

           4. Inv:随着迭代次数的增加而下降。LR = base_lr x(1+gmma x iter)^power

  • 相关阅读:
    欧几里得证明$sqrt{2}$是无理数
    博弈论和三人决斗
    数学证明和科学证明
    导电塑料入梦来
    宋朝记载的超新星爆发和光速不变
    混合溶剂中的高分子刷
    2015年总结和2016年展望
    一步一步学Silverlight 2系列(32):图形图像综合实例—“功夫之王”剧照播放
    一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果
    一步一步学Silverlight 2系列(30):使用Transform实现更炫的效果(下)
  • 原文地址:https://www.cnblogs.com/fourmi/p/9939666.html
Copyright © 2011-2022 走看看