[英]PyTorch softmax with dim
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 以反向傳播概率。
你有一個 1x3x4x2 張量 train_dataset。 您的 softmax 函數的 dim 參數確定在哪個維度上執行 Softmax 操作。 第一個維度是您的批次維度,第二個是深度,第三個是行,最后一個是列。 請看下面的圖片(抱歉畫得太糟糕了)以了解當您指定 dim 為 1 時 softmax 是如何執行的。
簡而言之,您的 4x2 矩陣的每個對應條目的總和等於 1。
更新:應該應用 softmax 的哪個維度的問題取決於您的張量存儲什么數據,以及您的目標是什么。
更新:圖片分類任務請參考pytorch官網教程。 它涵蓋了在真實數據集上使用 pytorch 進行圖像分類的基礎知識及其非常簡短的教程。 雖然那個教程沒有執行 Softmax 操作,但你需要做的只是在最后一個全連接層的輸出上使用torch.nn.functional.log_softmax 。 有關完整示例,請參閱 帶有 pytorch 的 MNIST 分類器。 在為完全連接的層展平后,您的圖像是 RGB 還是灰度無關緊要(還要記住,MNIST 示例的相同代碼可能不適合您,這取決於您使用的 pytorch 版本)。
對於大多數深度學習問題,我們肯定會批量處理。 所以dim永遠是1。不要混淆。通過我們只是說函數對每個批次的內容進行操作(這里是一個向量,即如果你有8個類,8個元素將在那里每一行)。 您也可以提及 dim=-1 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.