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. 64位Oracle11g自带的sqldevelper无法启动

    原因:选择的jdk有问题 解决方法:由于Oracle自带的Sqldeveloper只支持32位的java运行环境,如果本机安装64位jdk,需要手动更改SqlDeveloper路径到32位的jdk即可 ...

  2. 选iphone5可以正常编译运行 , 但是5s和6和6s都会编译报错

    选iphone5可以正常编译运行   但是5s和6和6s都会编译报错 iphone6编译报错iphone5s编译报错 解决办法是,Build settings里面把Architectures里面的$( ...

  3. Java一些基本帮助类

    Scanner sc=new Scanner(System.in); sc.nextInt(); sc.next(); Random ran=new Random(); ran.nextInt(); ...

  4. 经Gradle采取Jenkins的build

    如今,企业都太多Jenkins去管理apk,后该代码被提交jenkins在生成build 因此,我们可以得到jenkins提交版本 Jenkins在编制job什么时候,有一个内置的可变BUILD_NU ...

  5. PAT 1065 - 1068 题解

    这次的题目来源是 2013 年 10 月 7 日下午的浙大计算机研究生招生机试题. 这次题目的难度,按姥姥的说法是:『比普通的 PAT 要难了 0.5 个点.我是把自己的题目从 1.0 到 5.0 以 ...

  6. 正割函数(sec)

    1. 定义 正割与余弦互为倒数,余割与正弦互为倒数.即: ⎧⎩⎨⎪⎪⎪⎪secθ=1cosθcscθ=1sinθ 也即在几何上,设 △ABC,∠C=90°,AC=b,BC=a,AB=c, 正割函数:s ...

  7. 数据访问层之Repository

    数据访问层之Repository   接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ...

  8. 存储用es,消息队列用redis

    自动化确实方便,做微服务再合适不过了,单一jar包部署和管理都非常方便.只要系统架构设计合理,大型项目也能用.最近做的项目,统计中心和推荐系统,collector.calculator.recomme ...

  9. 部署NetCore项目(本文介绍用用IIS部署)

    首先要下载安装Core Runtim: 然后在IIS中的模块中就可以看到如下内容: 这时环境就搭好了: 下面按照正常的发布流程走就行了,关键看下面(一定要选择无托管代码)

  10. 《冰球撞击》Android休闲桌球类游戏现已面试,快来下载吧!

    <冰球撞击>Android休闲桌球类游戏现已完工上市快来下载吧! http://pan.baidu.com/s/1dD9vIRv <冰球撞击>是一个类似玩投篮机操作方式的And ...