暗淡的 PyTorch softmax

Posted

技术标签:

【中文标题】暗淡的 PyTorch softmax【英文标题】:PyTorch softmax with dim 【发布时间】:2019-03-01 23:59:58 【问题描述】:

softmax 应该应用于哪个维度?

这段代码:

%reset -f

import torch.nn as nn
import numpy as np
import torch

my_softmax = nn.Softmax(dim=-1)

mu, sigma = 0, 0.1 # mean and standard deviation

train_dataset = []
image = []
image_x = np.random.normal(mu, sigma, 24).reshape((3 , 4, 2))
train_dataset.append(image_x)

x = torch.tensor(train_dataset).float()

print(x)
print(my_softmax(x))
my_softmax = nn.Softmax(dim=1)
print(my_softmax(x))

打印以下内容:

tensor([[[[-0.1500,  0.0243],
          [ 0.0226,  0.0772],
          [-0.0180, -0.0278],
          [ 0.0782, -0.0853]],

         [[-0.0134, -0.1139],
          [ 0.0385, -0.1367],
          [-0.0447,  0.1493],
          [-0.0633, -0.2964]],

         [[ 0.0123,  0.0061],
          [ 0.1086, -0.0049],
          [-0.0918, -0.1308],
          [-0.0100,  0.1730]]]])
tensor([[[[ 0.4565,  0.5435],
          [ 0.4864,  0.5136],
          [ 0.5025,  0.4975],
          [ 0.5408,  0.4592]],

         [[ 0.5251,  0.4749],
          [ 0.5437,  0.4563],
          [ 0.4517,  0.5483],
          [ 0.5580,  0.4420]],

         [[ 0.5016,  0.4984],
          [ 0.5284,  0.4716],
          [ 0.5098,  0.4902],
          [ 0.4544,  0.5456]]]])
tensor([[[[ 0.3010,  0.3505],
          [ 0.3220,  0.3665],
          [ 0.3445,  0.3230],
          [ 0.3592,  0.3221]],

         [[ 0.3450,  0.3053],
          [ 0.3271,  0.2959],
          [ 0.3355,  0.3856],
          [ 0.3118,  0.2608]],

         [[ 0.3540,  0.3442],
          [ 0.3509,  0.3376],
          [ 0.3200,  0.2914],
          [ 0.3289,  0.4171]]]])

所以第一个张量在应用 softmax 之前,第二个张量是 softmax 应用到 dim=-1 的张量的结果,第三个张量是 softmax 应用到 dim=1 的张量的结果。

对于第一个 softmax 的结果,可以看到对应的元素总和为 1,例如 [0.4565, 0.5435] -> 0.4565 + 0.5435 == 1。

第二个 softmax 的结果是什么总和为 1?

我应该选择哪个暗淡值?

更新:尺寸(3 , 4, 2) 对应于图像尺寸,其中 3 是 RGB 值,4 是水平像素数(宽度),2 是垂直像素数(高度)。这是一个图像分类问题。我正在使用交叉熵损失函数。另外,我在最后一层使用 softmax 来反向传播概率。

【问题讨论】:

没有上下文很难判断。想象一下,我向您展示了 3 个变量 a、b、c,然后问您应该对哪个相加? 没有上下文,没有好的答案。 Softmax 产生一个概率分布,即对于每个元素 e_i、e_i \in [0, 1] 和 \sume_i = 1。你必须有充分的理由这样做(你是在计算概率吗?还是损失函数?)。在没有任何事先转换(即操作)的情况下在数据集上应用 softmax 对我来说真的没有意义。 @pltrdy 请查看更新,这是否提供了足够的上下文? 【参考方案1】:

你有一个 1x3x4x2 张量 train_dataset。您的 softmax 函数的 dim 参数决定了在哪个维度上执行 Softmax 操作。第一个维度是您的批次维度,第二个是深度,第三个是行,最后一个是列。请看下面的图片(很抱歉画得很糟糕),以了解当您将 dim 指定为 1 时如何执行 softmax。

简而言之,您的 4x2 矩阵的每个对应条目的总和等于 1。

更新:应该应用 softmax 的维度的问题取决于您的张量存储哪些数据,以及您的目标是什么。

更新:图片分类任务请查看pytorch官网tutorial。它涵盖了在真实数据集上使用 pytorch 进行图像分类的基础知识及其非常简短的教程。尽管该教程没有执行 Softmax 操作,但您只需在最后一个全连接层的输出上使用 torch.nn.functional.log_softmax。有关完整示例,请参阅 MNIST classifier with pytorch。在将图像展平为完全连接的层后,您的图像是 RGB 还是灰度并不重要(还请记住,MNIST 示例的相同代码可能不适合您,这取决于您使用的 pytorch 版本)。

【讨论】:

谢谢!请查看问题更新,这是否提供更多上下文? 更新了我的答案。【参考方案2】:

对于大多数深度学习问题,我们肯定会提出批处理。所以 dim 永远是 1。不要混淆它。通过我们只是说沿着每个批次的内容进行操作的函数(这里它是一个向量,即如果你有 8 个类,8 个元素将在那里每一行)。您也可以提及 dim=-1。

【讨论】:

以上是关于暗淡的 PyTorch softmax的主要内容,如果未能解决你的问题,请参考以下文章

pytorch KLDivLoss 损失为负

在导航抽屉中禁用暗淡化

在 Android 中禁用 ProgressDialog/AlertDialog 的背景暗淡

UIModalPresentationFormSheet,缺少暗淡

为啥在编码“填充掩码”时添加了新的暗淡

Numpy标准化多暗淡(> = 3)数组