nn.Softmax(dim) 的理解
Posted Enterings
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nn.Softmax(dim) 的理解相关的知识,希望对你有一定的参考价值。
使用pytorch框架进行神经网络训练时,涉及到分类问题,就需要使用softmax函数,这里以二分类为例,介绍nn.Softmax()函数中,参数的含义。
1. 新建一个2x2大小的张量,一行理解成一个样本经过前面网络计算后的输出(1x2),则batch_size是2。
import numpy as np
import torch
import torch.nn as nn
a = np.array([[1.5, 6.7],[6.8, 3.4]])
b = torch.from_numpy(a)
2. 下面调用nn.Softmax(dim),dim分别为0,1,看看结果是什么样子
f = nn.Softmax(dim = 0)
c = f(b)
结果: tensor([[0.0050, 0.9644], [0.9950, 0.0356]], dtype=torch.float64)
可以发现,是每一列和为1.
f = nn.Softmax(dim = 1)
结果:tensor([[0.0055, 0.9945], [0.9677, 0.0323]], dtype=torch.float64)
可以发现是每一行和为1
所以,当nn.Softmax的输入是一个二维张量时,其参数dim = 0,是让列之和为1;dim = 1,是让行之和为1。
若nn.Softmax的输入是三维张量时,dim的取值就变成了0,1,2,那又是代表什么意思呢,看下面的例子。
a = np.array([[[1.5, 6.7, 2.4],
[6.8, 3.4, 9.3]],
[[3.1, 6.5, 1.9],
[8.9, 1.2, 2.5]]])
我们把a换成一个三维数组,大小是2x2x3,可以看成是2个2x3大小的输入。
这时,我们定义Softmax函数的dim为0,则结果是:
tensor([[[0.1680, 0.5498, 0.6225],
[0.1091, 0.9002, 0.9989]],
[[0.8320, 0.4502, 0.3775],
[0.8909, 0.0998, 0.0011]]], dtype=torch.float64)
可以发现,0.1680+0.8320 = 1, 0.5498+0.4502 = 1,即dim = 0,是让两个2x3数据的对应位置和为1.
使dim=1,结果是:
tensor([[[0.0050, 0.9644, 0.0010],
[0.9950, 0.0356, 0.9990]],
[[0.0030, 0.9950, 0.3543],
[0.9970, 0.0050, 0.6457]]], dtype=torch.float64)
可以发现,0.0050+0.9950 = 1,0.9644+0.0356 = 1,即dim = 1,是让张量每个2x3数据自己的列之和为1.
使dim=2,就是让张量每个2x3数据自己的行之和为1.
作者:不太聪明的亚子
链接:https://www.jianshu.com/p/3d63f36cc960
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
tf.nn.softmax 分类
tf.nn.softmax(logits,axis=None,name=None,dim=None)
参数:
logits:一个非空的Tensor。必须是下列类型之一:half, float32,float64
axis:将在其上执行维度softmax。默认值为-1,表示最后一个维度
name:操作的名称(可选)
dim:axis的已弃用的别名
返回:
一个Tensor,与logits具有相同的类型和shape
sample
import tensorflow as tf
#tf.enable_eager_execution()
tf.compat.v1.enable_eager_execution()
ones = tf.ones(shape=[2,3])
print(ones)
temp1 = tf.nn.softmax(ones,axis=0) # 列
print(temp1)
temp2 = tf.nn.softmax(ones,axis=1) # 行
print(temp2)
output
tf.Tensor(
[[1. 1. 1.]
[1. 1. 1.]], shape=(2, 3), dtype=float32)
tf.Tensor(
[[0.5 0.5 0.5]
[0.5 0.5 0.5]], shape=(2, 3), dtype=float32)
tf.Tensor(
[[0.33333334 0.33333334 0.33333334]
[0.33333334 0.33333334 0.33333334]], shape=(2, 3), dtype=float32)
以上是关于nn.Softmax(dim) 的理解的主要内容,如果未能解决你的问题,请参考以下文章