view函数
把原先tensor中的数据按照行优先的顺序排成一个一维的数组,然后按照view函数中的参数组合成其它维度的tensor。
例子
import torch
a=torch.Tensor([[[1,2,3],[4,5,6]]])
print(a.view(2,3))
print(a.view(2,-1))
输出:
tensor([[1., 2., 3.],
[4., 5., 6.]])
tensor([[1., 2., 3.],
[4., 5., 6.]])
其中参数-1就是动态计算tensor的维度。
参考
PyTorch中view的用法
gather函数
torch.gather(input, dim, index, out=None)
Gathers values along an axis specified by dim.
For a 3-D tensor the output is specified by:
out[i][j][k] = input[index[i][j][k]][j][k] # dim=0
out[i][j][k] = input[i][index[i][j][k]][k] # dim=1
out[i][j][k] = input[i][j][index[i][j][k]] # dim=2
Parameters:
input (Tensor) – The source tensor
dim (int) – The axis along which to index
index (LongTensor) – The indices of elements to gather
out (Tensor, optional) – Destination tensor
import torch
b = torch.Tensor([[1,2,3],[4,5,6]])
print(b)
index_1 = torch.LongTensor([[0,1],[2,0]])
index_2 = torch.LongTensor([[0,1,1],[0,0,0]])
print(torch.gather(b, dim=1, index=index_1))
print(torch.gather(b, dim=0, index=index_2))
输出:
tensor([[1., 2., 3.],
[4., 5., 6.]])
tensor([[1., 2.],
[6., 4.]])
tensor([[1., 5., 6.],
[1., 2., 3.]])
如何理解:
由于:index_1[0][0]=0
index_1[0][1]=1
index_1[1][0]=2
index_1[1][1]=0
所以第一个输出:i=0,j=0时b[i=0][index_1[0][0]=0]=b[0][0]=1
i =0,j=1时 b[i=0][index_1[0][1]=1]=b[0][1]=2
i=1,j=0时 b[i=1][index_1[1][0]=2]=b[1][2]=6
i=1,j=1时 b[i=1][index_1[1][1]=0]=b[1][0]=4
从结果中也可以看出输出的维度和index矩阵维度相同
参考
利用pytorch中的gather函数取出矩阵中的元素
softmax公式
参考别人的回答
softmax公式大概可以解释为:
首先假设样本与理论标准函数的误差(类似于线性回归那一章中生成数据时叠加上的高斯误差)服从正态分布(高斯分布),并且不同样本之间独立同分布,通过贝叶斯公式计算各个分类的概率,将高斯分布的公式带入公式之后化简得到。在一些地方softmax函数又被称为归一化指数(normalized exponential)
以上说明方法来自书籍pattern recognition and machine learning中的一种线性分类概率生成式模型,原文中softmax函数形式为:
p
(
C
k
∣
x
)
=
p
(
x
∣
C
k
)
p
(
C
k
)
∑
j
p
(
x
∣
C
j
)
p
(
C
j
)
=
exp
(
a
k
)
∑
j
exp
(
a
j
)
p(C_{k}|x) = \frac{p(x|C_{k})p(C_{k})}{\sum_{j}p(x|C_{j})p(C_{j})}=\frac{\exp(a_{k})}{\sum_{j}\exp(a_{j})}
p(Ck∣x)=∑jp(x∣Cj)p(Cj)p(x∣Ck)p(Ck)=∑jexp(aj)exp(ak)
其中
a
k
=
ln
p
(
x
∣
C
k
)
p
(
C
k
)
a_{k}=\ln p(x|C_{k})p(C_{k})
ak=lnp(x∣Ck)p(Ck)
k为当前计算类别,j代表所有类别的索引
softmax函数处理的是经过处理之后已经生成的概率,另有证明多项式分布属于指数分布族后推导softmax函数的方法,处理的数据也是概率数据。