tensorflow 基础学习三:损失函数讲解

交叉熵损失:

给定两个概率分布p和q,通过q来表示p的交叉熵为:

从上述公式可以看出交叉熵函数是不对称的,即H(p,q)不等于H(q,p)。

交叉熵刻画的是两个概率分布之间的距离,它表示通过概率分布q来表示概率分布p的困难程度。所以使用交叉熵作为

神经网络的损失函数时,p代表的是正确答案,q代表的是预测值。当两个概率分布越接近时,它们的交叉熵也就越小。

由于神经网络的输出并不是一个概率分布,所以需要先使用softmax将网络输出变成一个概率分布,再计算交叉熵。

比如,原始的神经网络输出为y1,y2,……,yn,那么经过softmax处理后的输出为:

小例子:

以一个三分类为例,比如某个样本正确答案为(1,0,0)。某模型经过softmax回归后的预测答案为(0.5,0.4,0.1),则这个预测值和正确答案之间的交叉熵为:

H((1,0,0),(0.5,0.4,0.1))=-(1*log0.5+0*log0.4+0*log0.1))=0.3

假设另外一个模型的预测值是(0.8,0.1,0.1),则该预测值和真实值之间的交叉熵为:

H((1,0,0),(0.8,0.1,0.1))=-(1*log0.8+0*log0.1+0*log0.1)=0.1

从上述结果可以看出第二个预测答案要由于第一个。

tensorflow中实现交叉熵,如下所示:

cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))

其中y_代表正确结果,y代表预测结果。tf.clip_by_value函数可以将一个张量中的数值限制在一个范围内,这样可以避免

一些运算错误(比如log0是无效的)。下面讲解使用tf.clip_by_value函数的简单样例。

v=tf.constant([[1.0,2.0,3.0],[4.0,5.0,6.0]])
with tf.Session() as sess:
    print(tf.clip_by_value(v,2.5,4.5).eval())‘‘‘输出为[[ 2.5  2.5  3. ] [ 4.   4.5  4.5]]‘‘‘# tensorflow中提供的直接计算交叉熵损失的函数,y代表神经网络的输出结果,y_表示真实类别cross_entropy=tf.nn.softmax_cross_entropy_with_logits(logits=y,y_)

均方误差(MSE,mean squared error):

常用于回归问题中。它的具体定义如下:

$MES(y,y^{‘})=\frac{\sum _{i=1}^{n}(y_{i}-y_{i}^{‘})^{2}}{n}$

  其中,yi表示一个batch中第i个样本的真实类别,yi为神经网络输出的预测值。tensorflow代码实现如下:

mse=tf.reduce_mean(tf.square(y_-y))

自定义损失函数:

tensorlfow支持自定义损失函数,以下演示一个简单的示例:

首先定义一个分段损失函数,然后提供它的代码实现:

$Loss(y,y^{‘})=\sum_{i=1}^{n}f(y_{i},y_{i}^{‘}), f(x,y)=\left\{\begin{matrix}a(x-y)
 & x>y \\
 b(y-x) & x\leqslant y
\end{matrix}\right. $

loss=tf.recue_sum(tf.where(tf.greater(v1,v2),(v1-v2)*a,(v2-v1)*b))

tf.where和tf.greater函数用法如下:

# tf.where和tf.greater函数的用法
v1=tf.constant([1.0,2.0,3.0,4.0])
v2=tf.constant([4.0,3.0,2.0,1.0])

with tf.Session() as sess:
    print(tf.greater(v1,v2).eval())
    # 输出 [False False  True  True]
    print(.where(tf.greater(v1,v2),v1,v2).eval())
    # 输出 [ 4.  3.  3.  4.]

使用自定义损失函数实现一个简单的神经网络

该网络只有两个输入节点和一个输出节点,相当于实现了一个回归。

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)

# 使用上述自己定义的损失函数
a=1;b=10
loss=tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*a,(y_-y)*b))

train_step=tf.train.AdamOptimizer(0.001).minimize(loss)

# 随机生成一个模拟数据集
rdm=RandomState(1)
dataset_size=128
X=rdm.rand(dataset_size,2)
# 设置随机噪声,范围在-0.05~0.05
Y = [[x1+x2+rdm.rand()/10.0-0.05] for (x1,x2) in X]

# 训练神经网路
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    STEPS=5000
    for i in range(STEPS):
        start=(i*batch_size) % dataset_size
        end = min(start+batch_size,dataset_size)
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
    print(sess.run(w1))
时间: 2024-10-09 13:17:48

tensorflow 基础学习三:损失函数讲解的相关文章

Python入门基础学习 三

Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形,true就相当于1,false相当于0,可以用来计算 类型转换 转换:整数:int();字符串:str();浮点数:float() 转换例子:(图9) 如果用内置函数当变量名,比如str=123,一旦被赋值,再使用这个函数会被报错. type()函数可以明确告诉我们变量类型. isinstance

Dango基础学习三

今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为<静态路由>.<动态路由>.<二级路由> 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配到的urls转发到对应app的views的函数中 2.在对应的app的views中配置相应的函数 3.这个时候我们通过浏览器访问这个url,就可以得到如下的结果 ok.至此,静态路由我们就学习完了,下面我们开始学习动态路由 二.动态路由的学习,动态路由的学习主要

python 网络框架twisted基础学习及详细讲解

twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本. Protocol:Protocol对象实现协议内容,即通信的内容协议ProtocolFactory: 是工厂模式的体现,在这里面生成协议Transport: 是用来收发数据,服务器端与客户端的数据收发与处理都是基于这个模块 在windows中安装twisted需要先安装pywin32,自己去下载下就行.随后pip instal

tensorflow 基础学习五:MNIST手写数字识别

MNIST数据集介绍: from tensorflow.examples.tutorials.mnist import input_data # 载入MNIST数据集,如果指定地址下没有已经下载好的数据,tensorflow会自动下载数据 mnist=input_data.read_data_sets('.',one_hot=True) # 打印 Training data size:55000. print("Training data size: {}".format(mnist.

docker基础学习三

一.Dockerfile学习 由一系列的参数和命令构成的脚本.这些命令应用于基础镜像并最终创建一个新的镜像.基础镜像就是操作系统级别的镜像. 常用命令 FROM image_name:tag 定义了使用哪个基础镜像启动构建流程 MAINTAINER user_name 声明镜像的创建者 ENV key value 设置环境变量 (可以写多条) RUN command 是Dockerfile的核心部分(可以写多条) ADD source_dir/file dest_dir/file 将宿主机的文件

tensorflow 基础学习二:实现一个神经网络

tensorflow变量 在tensorflow中,变量(tf.Variable)的作用就是用来保存和更新神经网络中的参数,在声明变量的同时需要指定其初始值. tensorflow中支持的随机数生成器: 函数名称 随机数分布 主要参数 tf.random_normal 正态分布 平均值.标准差.取值类型 tf.truncated_normal 正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机 平均值.标准差.取值类型 tf.random_uniform 平均分布 最

tensorflow 基础学习九:mnist卷积神经网络

mnist_inference.py: # -*- coding:utf-8 -*- import tensorflow as tf # 配置神经网络参数 INPUT_NODE=784 OUTPUT_NODE=10 IMAGE_SIZE=28 NUM_CHANNELS=1 NUM_LABELS=10 # 第一层卷积层的尺寸和深度 CONV1_DEEP=32 CONV1_SIZE=5 # 第二层卷积层的尺寸和深度 CONV2_DEEP=64 CONV2_SIZE=5 # 全连接层的节点个数 FC_

salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)

在salesforce的classic中,我们使用{!expresion}在前台页面展示信息,在lightning中,上一篇我们也提及了,如果展示attribute的值,可以使用{!v.expresion}展示信息. lightning在component中解析动态值的时候,会将{!} 这个里面的变量进行动态的解析以及展示.当然这个变量可以是基础类型,自定义类型,数组集合等等,当然如果表达式为空字符串或者是空格则不会解析.偶尔特殊的要求为需要输出'{!}'这个字符串,官方文档说可以使用<aura

JAVA多线程基础学习三:volatile关键字

Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个关键字的作用就是告诉编译器,只要是被此关键字修饰的变量都是易变的.不稳定的.那为什么是易变的呢?因为volatile所修饰的变量是直接存在于主内存中的,线程对变量的操作也是直接反映在主内存中,所以说其是易变的. 一.Java内存模型 Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理