tf.nn.softmax

softmax是神经网络的最后一层将实数空间映射到概率空间的常用方法,公式如下:

\[softmax(x)_i=\frac{exp(x_i)}{\sum_jexp(x_j)}
\]

本文意于分析tensorflow中的tf.nn.softmax(),关于softmax的具体推导和相关知识点,参照其它文章

tensorflow的tf.nn.softmax()函数实现位于这里,可以看到,实现起来相当简明:

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

看一个例子:

x=tf.constant([[[1.0,2.0],[3.0,4.0]],
[[5.0,6.0],[7.0,9.0]],
[[9.0,10.0],[11.0,12.0]]]) with tf.Session() as sess:
print(sess.run(tf.nn.softmax(x,axis=0)))
print(sess.run(tf.nn.softmax(x,axis=1)))
print(sess.run(tf.nn.softmax(x,axis=2)))

这里主要关注axis参数,它表示在那个维度上做softmax。从上面可以看到,axis参数传递给了tf.reduce_sum。上述的运行结果类似于:

axis=0:
[[[3.2932041e-04 3.2932041e-04]
[3.2932041e-04 3.2932041e-04]]
[[1.7980287e-02 1.7980287e-02]
[1.7980287e-02 1.7980287e-02]]
[[9.8169035e-01 9.8169035e-01]
[9.8169035e-01 9.8169035e-01]]] axis=1:
[[[0.11920291 0.11920291]
[0.880797 0.880797 ]]
[[0.11920291 0.11920291]
[0.880797 0.880797 ]]
[[0.11920291 0.11920291]
[0.880797 0.880797 ]]] axis=2:
[[[0.26894143 0.7310586 ]
[0.26894143 0.7310586 ]]
[[0.26894143 0.7310586 ]
[0.26894143 0.7310586 ]]
[[0.26894143 0.7310586 ]
[0.26894143 0.7310586 ]]]

这里以axis=0为例,tf.reduce_sum(tf.exp(x),axis=0)的结果为:

[[  8254.216  22437.285]
[ 60990.863 165790.34 ]]

tf.exp(x)的结果为:

[[[2.7182817e+00 7.3890562e+00]
[2.0085537e+01 5.4598152e+01]]
[[1.4841316e+02 4.0342880e+02]
[1.0966332e+03 2.9809580e+03]]
[[8.1030840e+03 2.2026467e+04]
[5.9874145e+04 1.6275478e+05]]]

假设最外层axis=0的维度表示样本数,取出第一个样本看其计算过程,可知:

[[3.2932041e-04 3.2932041e-04]
[3.2932041e-04 3.2932041e-04]]=
[[2.7182817e+00 7.3890562e+00]
[2.0085537e+01 5.4598152e+01]]
/
[[ 8254.216 22437.285]
[ 60990.863 165790.34 ]]

也就是样本概率加和为1,也就是对axis=0处做softmax(axis=0维度上,概率加和为1),而其“内部”的值一样。

tf.reduce_sum

这里从tf.reduce_sum函数这个角度提一下,tensorflow中的维度这个参数。axis这个参数可以从张量从外向里看,axis=0表示最外一层,举例而言:

x=tf.constant([[[1.0,2.0],[3.0,4.0]],
[[5.0,6.0],[7.0,9.0]],
[[9.0,10.0],[11.0,12.0]]]) with tf.Session() as sess:
print(sess.run(tf.reduce_sum(x,axis=0)))

上述这个例子中,x的shape为[3,2,2]。最外层的张量有3个元素,现在要对最外层(也就是axis=0)reduce_sum,也就是:

[[1.0,2.0],[3.0,4.0]]+[[5.0,6.0],[7.0,9.0]]+[[9.0,10.0],[11.0,12.0]]
=[[15.0,18.0],[21.0,24.0]]

3维张量内部的2维张量,对应位置相加。例如:15.0=1.0+5.0+9.0

同样的:

with tf.Session() as sess:
print(sess.run(tf.reduce_sum(x,axis=1)))
print(sess.run(tf.reduce_sum(x,axis=2)))

axis=1时,是第二层,第二层中每个张量有2个元素,对于第一个第二层(axis=1)张量[[1.0,2.0],[3.0,4.0]],现在要对其reduce_sum,运算过程如下:

[1.0,2.0]+[3.0,4.0]=[4.0,6.0]

第二个第二层张量和第三个第二层张量运算过程:

[5.0,6.0]+[7.0,8.0]=[12.0,14.0]
[[9.0,10.0]+[11.0,12.0]]=[20.0,22.0]

拼合起来结果就是:

[[ 4.  6.]
[12. 14.]
[20. 22.]]

当axis=2时,也就是

with tf.Session() as sess:
print(sess.run(tf.reduce_sum(x,axis=2)))

结果是什么呢?

[[ 3.  7.]
[11. 15.]
[19. 23.]]

其中,3.0=1.0+2.0

tf.nn.softmax_cross_entropy_with_logits

一般我们在用softmax做最后一层,计算loss时常常用到该函数,函数签名:

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
  • logits:神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes]。单样本的话,大小就是num_classes
  • labels:标签,大小要与logits保持一致

计算过程分为2步:

  • 对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,output_shape: [None, num_classes]

  • 对每个样本,使用神经网络的输出和真实标签做交叉熵,交叉熵公式如下:

    \[H_{y'}(y)=-\sum_iy_i'log(y_i)
    \]

    对单个样本而言,\(y_i'\)是真实标签第i维的值,\(y_i\)是神经网络输出的向量的第i维的值。可以看到,\(y_i'\)和\(y_i\)越一致,交叉熵越小,所以可以使用交叉熵作为loss。交叉熵可以参考其它文章

    该函数返回向量,要求标量交叉熵,可以使用tf.reduce_sum将其变为标量

tf.nn.softmax & tf.nn.reduce_sum & tf.nn.softmax_cross_entropy_with_logits的更多相关文章

  1. 深度学习原理与框架-Tensorflow基本操作-mnist数据集的逻辑回归 1.tf.matmul(点乘操作) 2.tf.equal(对应位置是否相等) 3.tf.cast(将布尔类型转换为数值类型) 4.tf.argmax(返回最大值的索引) 5.tf.nn.softmax(计算softmax概率值) 6.tf.train.GradientDescentOptimizer(损失值梯度下降器)

    1. tf.matmul(X, w) # 进行点乘操作 参数说明:X,w都表示输入的数据, 2.tf.equal(x, y) # 比较两个数据对应位置的数是否相等,返回值为True,或者False 参 ...

  2. tf.nn.softmax(logits,name=None)

    tf.nn.softmax( logits, axis=None, name=None, dim=None #dim在后来改掉了 ) 通过Softmax回归,将logistic的预测二分类的概率的问题 ...

  3. 对tf.nn.softmax的理解

    对tf.nn.softmax的理解 转载自律者自由 最后发布于2018-10-31 16:39:40 阅读数 25096  收藏 展开 Softmax的含义:Softmax简单的说就是把一个N*1的向 ...

  4. tf.nn.softmax 分类

    tf.nn.softmax(logits,axis=None,name=None,dim=None) 参数: logits:一个非空的Tensor.必须是下列类型之一:half, float32,fl ...

  5. 深度学习原理与框架-图像补全(原理与代码) 1.tf.nn.moments(求平均值和标准差) 2.tf.control_dependencies(先执行内部操作) 3.tf.cond(判别执行前或后函数) 4.tf.nn.atrous_conv2d 5.tf.nn.conv2d_transpose(反卷积) 7.tf.train.get_checkpoint_state(判断sess是否存在

    1. tf.nn.moments(x, axes=[0, 1, 2])  # 对前三个维度求平均值和标准差,结果为最后一个维度,即对每个feature_map求平均值和标准差 参数说明:x为输入的fe ...

  6. 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)

    1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')  # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...

  7. Difference between nn.softmax & softmax_cross_entropy_with_logits & softmax_cross_entropy_with_logits_v2

    nn.softmax 和 softmax_cross_entropy_with_logits 和 softmax_cross_entropy_with_logits_v2 的区别   You have ...

  8. 深度学习原理与框架-Tfrecord数据集的读取与训练(代码) 1.tf.train.batch(获取batch图片) 2.tf.image.resize_image_with_crop_or_pad(图片压缩) 3.tf.train.per_image_stand..(图片标准化) 4.tf.train.string_input_producer(字符串入队列) 5.tf.TFRecord(读

    1.tf.train.batch(image, batch_size=batch_size, num_threads=1) # 获取一个batch的数据 参数说明:image表示输入图片,batch_ ...

  9. 对抗生成网络-图像卷积-mnist数据生成(代码) 1.tf.layers.conv2d(卷积操作) 2.tf.layers.conv2d_transpose(反卷积操作) 3.tf.layers.batch_normalize(归一化操作) 4.tf.maximum(用于lrelu) 5.tf.train_variable(训练中所有参数) 6.np.random.uniform(生成正态数据

    1. tf.layers.conv2d(input, filter, kernel_size, stride, padding) # 进行卷积操作 参数说明:input输入数据, filter特征图的 ...

随机推荐

  1. Spark修炼之道(基础篇)——Linux大数据开发基础:第三节:用户和组

    本节主要内容 理解用户和组的概念 用户管理 组管理 权限分配 1. 理解用户和组的概念 在第一讲中我们提到.linux是一种多任务.多用户的操作系统,在讲ls -l命令行我们看到例如以下文件具体信息: ...

  2. 【t095】拯救小tim

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小tim在游乐场,有一天终于逃了出来!但是不小心又被游乐场的工作人员发现了... 所以你的任务是安全地 ...

  3. 微信小程序实例:实现tabs选项卡效果

    最近微信应用号是炒的如火如荼,热门满满,但是也可以发现搜索关键词出来,各类网站出现的还都是微信的官方文档解释.正好赶上这个热潮,这几天先把小程序技术文档看了个遍,就直接着手写案例了.很多组件微信内部已 ...

  4. unix shell(壳)的简单实现

    用户程序通过调用操作系统提供的系统调用(system call)API 来获得操作系统提供的各种服务.但使用 API 需要手动编写程序.对于不编程序.且需要与操作系统进行交互的用户,又如何使用操作系统 ...

  5. Bit error testing and training in double data rate (ddr) memory system

    DDR PHY interface bit error testing and training is provided for Double Data Rate memory systems. An ...

  6. caffe 源码阅读

    bvlc:Berkeley Vision and Learning Center. 1. 目录结构 models(四个文件夹均有四个文件构成,deploy.prototxt, readme.md, s ...

  7. Struts2——(7)拦截器组件

    AOP:面向切面编程(通过配置文件来指定作用到目标对象) OOP:面向对象编程 AOP具有很好的可插拔特性,很灵活. 可用于封装共通的业务处理,之后可以通过配置作用到Action组件上. 共通的业务处 ...

  8. DDD的.NET开发框架

    基于DDD的.NET开发框架ABP实例,多租户 (Sass)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍 介绍 基于ABPZERO的多租户 (Sass) ...

  9. HDU1078 FatMouse and Cheese 【内存搜索】

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. python 判断一个数为?

    1. 判断一个变量是否数字(整数.浮点数)? instance('a', (int, long, float)) True isinstance('a', (int, long, float)) Fa ...