【TensorFlow-windows】部分损失函数测试

前言

在TensorFlow中提供了挺多损失函数的,这里主要测试一下均方差与交叉熵相关的几个函数的计算流程。主要是测试来自于tf.nntf.lossesmean_square_errorsigmoid_cross_entrysoftmax_cross_entrysparse_softmax_cross_entry

国际惯例,参考博客:

官方文档

一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉

TensorFlow中多标签分类

预备

单热度编码one-hot

先复习一下one_hot编码,就是将真实标签转换为01标签,需要注意的是tf的one_hot编码中标签0代表的是1,0,0...而非0,0,0...

labels_n=np.array([0,1,2])
labels_oh=tf.one_hot(labels_n,depth=3)
with tf.Session() as sess:print(sess.run(labels_oh))'''[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]'''

softmax

通常将最后的输出规整到和为1的形式:

softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis)

设输出为z=(z1,z2,⋯ ,zn)z=(z_1,z_2,\cdots,z_n)z=(z1,z2,,zn),则
σ(z)j=ezj∑i=1nezk\sigma(z)_j=\frac{e^{z_j}}{\sum_{i=1}^n e^{z_k}} σ(z)j=i=1nezkezj

sigmoid

激活函数:
f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1

交叉熵

多标签分类(每个样本可能属于多个标签),最后一层使用sigmoid激活:

−ylog⁡(P(y))−(1−y)log⁡(1−P(y))-y\log(P(y))-(1-y)\log(1-P(y)) ylog(P(y))(1y)log(1P(y))

单标签分类(每个样本只可能属于一个标签),最后一层使用softmax激活:
−∑i=1nyilog⁡(P(yi))-\sum_{i=1}^n y_i\log(P(y_i)) i=1nyilog(P(yi))

准备测试

进入测试之前,需要先引入相关的包

import numpy as np
import tensorflow as tf

交叉熵相关函数的测试,使用的变量是

labels=np.array([[1,0,0],[0,1,0],[0,0,1]],dtype='float32')
preds=np.array([[5,6,3],[7,5,1],[1,2,8]],dtype='float32')

均方差损失-MSE

原理

对应项相减的平方和的均值,通常用来做回归,计算预测值与真实值的误差

代码测试

定义相关变量:

ori_labels=np.array([[1,2,3]],dtype='float32')
pred_labels=np.array([[5,3,3]],dtype='float32')

调用原本函数测试:

mse_op=tf.losses.mean_squared_error(labels=ori_labels,predictions=pred_labels)
with tf.Session() as sess:print(sess.run(mse_op))'''5.6666665'''

手动实现过程:

with tf.Session() as sess:print(sess.run(tf.reduce_mean(tf.square(ori_labels-pred_labels))))
'''
5.6666665
'''

总结

原理就是求原标签与预测标签的平方和损失的均值。

sigmoid_cross_entry

原理

使用sigmoid激活的交叉熵,毫无疑问,玩得多标签分类,流程是:

  • 将输出用sigmoid激活
  • 使用多标签分类的交叉熵计算损失

代码测试

使用tf.losses中的交叉熵损失

tf_sce=tf.losses.sigmoid_cross_entropy(labels,preds)
with tf.Session() as sess:print(sess.run(tf_sce))
#2.3132434

使用tf.nn中的交叉熵损失:

tf_sce1=tf.nn.sigmoid_cross_entropy_with_logits(labels=labels,logits=preds)
with tf.Session() as sess:print(sess.run(tf_sce1))
'''[[6.7153485e-03 6.0024757e+00 3.0485873e+00][7.0009112e+00 6.7153485e-03 1.3132617e+00][1.3132617e+00 2.1269281e+00 3.3540637e-04]]
'''

使用流程实现:

#先计算sigmoid,再计算交叉熵
preds_sigmoid=tf.sigmoid(preds)
ce=-labels*tf.log(preds_sigmoid)-(1-labels)*(tf.log(1-preds_sigmoid))
# ce= - tf.reduce_sum(labels*tf.log(preds_sigmoid),-1)
with tf.Session() as sess:print(sess.run(ce))print(sess.run(tf.reduce_mean(ce)))
'''
[[6.7153242e-03 6.0024934e+00 3.0485876e+00][7.0009704e+00 6.7153242e-03 1.3132617e+00][1.3132617e+00 2.1269276e+00 3.3539196e-04]]
2.3132522
'''

总结

  • 多标签分类,输入是原始和预测标签的编码

  • tf.losses中的计算结果是tf.nn中计算结果的均值

softmax_cross_entry

原理

使用softmax激活,显然就是单标签分类的情况,流程是:

  • 将输出用softmax激活
  • 计算单标签分类的交叉熵损失

代码测试

使用tf.losses中的函数:

tf_sce=tf.losses.softmax_cross_entropy(labels,preds)
with tf.Session() as sess:print(sess.run(tf_sce))
#1.160502

使用tf.nn中的函数:

tf_sce1=tf.nn.softmax_cross_entropy_with_logits(labels=labels,logits=preds)
with tf.Session() as sess:print(sess.run(tf_sce1))
#[1.3490121  2.129109   0.00338493]

使用流程计算:

#先计算softmax,再计算交叉熵
preds_sigmoid=tf.nn.softmax(preds)
ce= - tf.reduce_sum(labels*tf.log(preds_sigmoid),-1)
# ce=-labels*tf.log(preds_sigmoid)-(1-labels)*(tf.log(1-preds_sigmoid))
with tf.Session() as sess:print(sess.run(ce))print(sess.run(tf.reduce_mean(ce)))
'''
[1.3490121  2.129109   0.00338495]
1.1605021
'''

总结

  • 用于单标签分类,输入是真实和预测标签的单热度编码
  • tf.losses中的计算结果是tf.nn中计算结果的均值

sparse_softmax_cross_entry

原理

还是看到softmax,依旧是单标签分类,但是多了个sparse,代表输入标签可以是非单热度标签,流程:

  • 将原标签转为单热度编码
  • 将输出用softmax激活
  • 计算单标签分类的交叉熵

代码测试

假设原始标签的非单热度编码是:

labels_n=np.array([0,1,2])

利用tf.losses中的损失函数:

tf_scen=tf.losses.sparse_softmax_cross_entropy(labels=labels_n,logits=preds)
with tf.Session() as sess:print(sess.run(tf_sce))
#1.160502

利用tf.nn中的损失函数:

tf_sce1=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels_n,logits=preds)
with tf.Session() as sess:print(sess.run(tf_sce1))print(sess.run(tf.reduce_mean(tf_sce1)))
'''
[1.3490121  2.129109   0.00338493]
1.160502
'''

利用流程实现:

labels_onehot=tf.one_hot(labels_n,depth=3)
preds_sigmoid=tf.nn.softmax(preds)
ce= - tf.reduce_sum(labels_onehot*tf.log(preds_sigmoid),-1)
# ce=-labels*tf.log(preds_sigmoid)-(1-labels)*(tf.log(1-preds_sigmoid))
with tf.Session() as sess:print(sess.run(labels_onehot))print(sess.run(ce))print(sess.run(tf.reduce_mean(ce)))  '''
[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]
[1.3490121  2.129109   0.00338495]
1.1605021
'''

总结

  • sparse代表原始标签不用转成单热度编码
  • 适用于单标签分类
  • tf.lossestf.nn中函数的均值

总结

本文主要对比了:

  • tf.nntf.losses中同一类损失函数的使用方法与区别
  • 分析计算流程,并实现验证
  • 了解TensorFlow中回归、单标签分类、多标签分类的损失函数的选择

博客代码:

链接:https://pan.baidu.com/s/1b40rNxjdOIIE2g7_Afctiw
提取码:0sb0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RS编码-Python工具包使用

前言 最近学习二维码相关知识,遇到了ReedSolomon编码,简称RS编码,中文名里德所罗门编码。遇到的问题是使用的工具包返回的编码是bytearray类型,而二维码是二进制01编码,所以本博客主要验证,如何将bytearra…

【TensorFlow-windows】MobileNet理论概览与实现

前言 轻量级神经网络中,比较重要的有MobileNet和ShuffleNet,其实还有其它的,比如SqueezeNet、Xception等。 本博客为MobileNet的前两个版本的理论简介与Keras中封装好的模块的对应实现方案。 国际惯例,参考博客: 纵…

【TensorFlow-windows】keras接口——ImageDataGenerator裁剪

前言 Keras中有一个图像数据处理器ImageDataGenerator,能够很方便地进行数据增强,并且从文件中批量加载图片,避免数据集过大时,一下子加载进内存会崩掉。但是从官方文档发现,并没有一个比较重要的图像增强方式&#x…

【TensorFlow-windows】name_scope与variable_scope

前言 探索一下variable_scope和name_scope相关的作用域,为下一章节tensorboard的学习做准备 其实关于variable_scope与get_variable实现变量共享,在最开始的博客有介绍过: 【TensorFlow-windows】学习笔记二——低级API 当然还是国际惯例…

【TensorFlow-windows】TensorBoard可视化

前言 紧接上一篇博客,学习tensorboard可视化训练过程。 国际惯例,参考博客: MNIST机器学习入门 Tensorboard 详解(上篇) Tensorboard 可视化好帮手 2 tf-dev-summit-tensorboard-tutorial tensorflow官方mnist_…

深度学习特征归一化方法——BN、LN、IN、GN

前言 最近看到Group Normalization的论文,主要提到了四个特征归一化方法:Batch Norm、Layer Norm、Instance Norm、Group Norm。此外,论文还提到了Local Response Normalization(LRN)、Weight Normalization(WN)、Batch Renormalization(BR)…

【TensorFlow-windows】keras接口——利用tensorflow的方法加载数据

前言 之前使用tensorflow和keras的时候,都各自有一套数据读取方法,但是遇到一个问题就是,在训练的时候,GPU的利用率忽高忽低,极大可能是由于训练过程中读取每个batch数据造成的,所以又看了tensorflow官方的…

【TensorFlow-serving】初步学习模型部署

前言 初步学习tensorflow serving的手写数字识别模型部署。包括简单的模型训练、保存、部署上线。因为对docker和网络不太熟悉,可能会有部分错误,但是看完博客,能跑通整个流程。此博客将详细介绍流程,但是不详细介绍每个流程的每…

Tensorflow 指令加速

一直没注意过使用Tensorflow的时候有一条warning: Warning: your cpu supports instructions that this tensorflow binary was not compiled to use: avx2 fma这玩意是可以用来加速推断的,分CPU和GPU版,业务相关部署在CPU上,实测…

骨骼动画——论文与代码精读《Phase-Functioned Neural Networks for Character Control》

前言 最近一直玩CV,对之前学的动捕知识都忘得差不多了,最近要好好总结一下一直以来学习的内容,不能学了忘。对2017年的SIGGRAPH论文《Phase-Functioned Neural Networks for Character Control》进行一波深入剖析吧,结合源码。 额…

颜色协调模型Color Harmoniztion

前言 最近做换脸,在肤色调整的那一块,看到一个有意思的文章,复现一波玩玩。不过最后一步掉链子了,有兴趣的可以一起讨论把链子补上。 主要是github上大佬的那个复现代码和原文有点差异,而且代码复杂度过高&#xff0…

Openpose推断阶段原理

前言 之前出过一个关于openpose配置的博客,不过那个代码虽然写的很好,而且是官方的,但是分析起来很困难,然后再opencv相关博客中找到了比较清晰的实现,这里分析一波openpose的推断过程。 国际惯例,参考博…

换脸系列——眼鼻口替换

前言 想着整理一下换脸相关的技术方法,免得以后忘记了,最近脑袋越来越不好使了。应该会包含三个系列: 仅换眼口鼻;换整个面部;3D换脸 先看看2D换脸吧,网上已经有现成的教程了,这里拿过来整理一…

换脸系列——整脸替换

前言 前面介绍了仅替换五官的方法,这里介绍整张脸的方法。 国际惯例,参考博客: [图形算法]Delaunay三角剖分算法 维诺图(Voronoi Diagram)分析与实现 Delaunay Triangulation and Voronoi Diagram using OpenCV (…

3D人脸重建——PRNet网络输出的理解

前言 之前有款换脸软件不是叫ZAO么,分析了一下,它的实现原理绝对是3D人脸重建,而非deepfake方法,找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。 国际惯例,参考博客: 什…

tensorflow官方posenet模型解析

前言 tensorflow官方有个姿态估计项目,这个输入和openpose还有点不一样,这里写个单人情况下的模型输出解析方案。 国际惯例,参考博客: 博客: 使用 TensorFlow.js 在浏览器端上实现实时人体姿势检测 tensorflow中posnet的IOS代…

tensorflow2安装时候的一个dll找不到的错误

电脑环境: vs2015python3.7.6,使用anaconda安装的CUDA 10.1cuDnn 7.6.5tensorflow2.1.0 错误内容 File "C:\Users\zb116\anaconda3\lib\imp.py", line 242, in load_modulereturn load_dynamic(name, filename, file)File "C:\Users\z…

PCA、SVD、ZCA白化理论与实现

简介 在UFLDL中介绍了主成分分析这一块的知识,而且当时学机器学习的时候,老师是将PCA和SVD联系起来将的,同时UFLDL也讲到了使用PCA做数据白化whitening处理,这个词经常在论文里面看到。 国际惯例,参考博客&#xff1…

OpenCV使用Tensorflow2-Keras模型

前言 最近工作上需要在C上快速集成Tensorflow/Keras训练好的模型,做算法验证。首先想到的就是opencv里面的dnn模块了,但是它需要的格式文件比较郁闷,是pb格式的模型,但是keras通常保存的是h5文件,查阅了很多资料&…

3D人脸表情驱动——基于eos库

前言 之前出过三篇换脸的博文,遇到一个问题是表情那一块不好处理,可行方法是直接基于2D人脸关键点做网格变形,强行将表情矫正到目标人脸,还有就是使用PRNet的思想,使用目标人脸的顶点模型配合源人脸的纹理&#xff0c…