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:\n‘ % i, w1.eval())
print(‘final w1:\n‘, 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

原文地址:https://www.cnblogs.com/fourmi/p/9939666.html

时间: 2024-08-29 11:45:42

Tensorflow 损失函数及学习率的四种改变形式的相关文章

javascript——四种函数调用形式

此文的目的是分析函数的四种调用形式,弄清楚函数中this的意义,明确构造函对象的过程,学会使用上下文调用函数. 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C#或 其他描述性语言那样仅仅作为一个模块来使用. 函数有四种调用模式,分别是:函数调用形式.方法调用形式.构造器形式.以及apply形式. 这里所有的调用模式中,最主要的区别在于关键字 this 的意义. 下面分别介绍这个几种调用形式. 一.函数调用形式 函数调用形式是最常见的形式,也是最好理

随机变量以及近似函数的四种收敛形式

四种收敛的形式: **distribution convergence**:$$X_n \overset{d}{\to} X \\ F_n(x) \to F(x)$$ 一个随机变量的分布函数收敛于另外一个函数,也就是只关心两个随机变量/函数的分布,而不关心他们在具体值上面的关系,两个实验进行一次得到的结果没有关系,只是在宏观层面上分布相同.**probability convergence**:$$X_n \overset{P}{\to} X \\ n \to \infty,\forall \e

07_Fiddler_post提交到主体的四种参数形式

post的请求相对于get请求多了个body部分,本篇就详细讲解下body部分参数的几种形式. 一.body数据类型 常见的post提交数据类型有四种: 1.第一种:application/json:这是最常见的json格式,也是非常友好的深受小伙伴喜欢的一种,如下 {"input1":"xxx","input2":"ooo","remember":false} 2.第二种:application/x-ww

get的四种请求形式

$_GET变量当用户以get方式请求页面并发送数据的时候,$_GET变量就存储了这些数据——get数据!get请求有4种形式:形式1:<form  action=”abc.php”   method=”get”>这里就是若干个表单项,每个表单项的数据,都是一个$_GET数组的一个单元.表单项1: <input  type=”text”  name=”v1”   />表单项2: <input  type=”text”  name=”v2”   /><input  t

函数中的this的四种绑定形式

目录 this的默认绑定 this的隐式绑定 隐式绑定下,作为对象属性的函数,对于对象来说是独立的 在一串对象属性链中,this绑定的是最内层的对象 this的显式绑定:(call和bind方法) new绑定 正文 javascript中的this和函数息息相关,所以今天,我就给大家详细地讲述一番:javascript函数中的this 一谈到this,很多让人晕晕乎乎的抽象概念就跑出来了,这里我就只说最核心的一点--函数中的this总指向调用它的对象,接下来的故事都将围绕这一点展开   (提醒前

【javascript】函数中的this的四种绑定形式

目录 this的默认绑定 this的隐式绑定 隐式绑定下,作为对象属性的函数,对于对象来说是独立的 在一串对象属性链中,this绑定的是最内层的对象 this的显式绑定:(call和bind方法) new绑定 正文 javascript中的this和函数息息相关,所以今天,我就给大家详细地讲述一番:javascript函数中的this 一谈到this,很多让人晕晕乎乎的抽象概念就跑出来了,这里我就只说最核心的一点--函数中的this总指向调用它的对象,接下来的故事都将围绕这一点展开   (提醒前

tensorflow中四种不同交叉熵函数tf.nn.softmax_cross_entropy_with_logits()

Tensorflow中的交叉熵函数tensorflow中自带四种交叉熵函数,可以轻松的实现交叉熵的计算. tf.nn.softmax_cross_entropy_with_logits() tf.nn.sparse_softmax_cross_entropy_with_logits() tf.nn.sigmoid_cross_entropy_with_logits() tf.nn.weighted_cross_entropy_with_logits()注意:tensorflow交叉熵计算函数输入

TensorFlow基础——常用函数(四)

Tensorflow一些常用基本概念与函数(四) 摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解.为‘Tensorflow一些常用基本概念与函数’系列之四. 1.序言 本文所讲的内容主要为以下列表中相关函数.函数training()通过梯度下降法为最小化损失函数增加了相关的优化操作,在训练过程中,先实例化一个优化函数,比如 tf.train.GradientDescentOptimizer,并基

四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的. [优点]      ①允许应用