1.utils.logmeanexp(outputs, dim)
outputs为输入张量, dim为指定维数(指定后该维消失)
特殊的,outputs一维时,dim可不加
import torch
import utils
a = torch.randn(3,2,1)
outputs = torch.tensor(a)
'''1'''
log_outputs = utils.logmeanexp(outputs, dim=2)
print('outputs:', outputs, outputs.shape, 'log_outputs:', log_outputs, log_outputs.shape)
# outputs: torch.Size([3, 2, 1]) log_outputs: torch.Size([3, 2])
'''2'''
log_outputs = utils.logmeanexp(outputs, dim=1)
print('outputs:', outputs, outputs.shape, 'log_outputs:', log_outputs, log_outputs.shape)
# outputs: torch.Size([3, 2, 1]) log_outputs: torch.Size([3, 1])
'''3'''
log_outputs = utils.logmeanexp(outputs, dim=0)
print('outputs:', outputs, outputs.shape, 'log_outputs:', log_outputs, log_outputs.shape)
# outputs: torch.Size([3, 2, 1]) log_outputs: torch.Size([3, 1])
'''4'''
outputs = torch.randn(3)
log_outputs = utils.logmeanexp(outputs)###log_outputs = utils.logmeanexp(outputs, dim=0)也可以
print('outputs:', outputs, outputs.shape, 'log_outputs:', log_outputs, log_outputs.shape)
#outputs: tensor([-0.3776, -0.5505, 1.6139]) torch.Size([3]) log_outputs: tensor(0.7395) torch.Size([])
2.代码解释
1.对于log_outputs = utils.logmeanexp(outputs, dim=2)
有
outputs: tensor([[[-1.1954],
[ 0.1321]],
[[ 1.4576],
[-0.0446]],
[[-0.9327],
[-1.3143]]]) torch.Size([3, 2, 1]) log_outputs: tensor([[-1.1954, 0.1321],
[ 1.4576, -0.0446],
[-0.9327, -1.3143]]) torch.Size([3, 2])
2.对于log_outputs = utils.logmeanexp(outputs, dim=1)
有
outputs: tensor([[[-0.9949],
[-0.2391]],
[[ 0.3857],
[-1.1477]],
[[-0.5240],
[-2.0448]]]) torch.Size([3, 2, 1]) log_outputs: tensor([[-0.5472],
[-0.1120],
[-1.0195]]) torch.Size([3, 1])
第二维消失,log_outputs为两维的结果取log平均如式(2.1)所示(注:log为e为底数,对示例中N=2): log 1 N ∑ n = 1 N e i x , \log\frac{1}{N}\sum_{n=1}^N\!e^x_i, logN1∑n=1Neix,(2.1)
3和4同理
3. 总结
要点:对指定的dim使用公式 log 1 N ∑ n = 1 N e i x , \log\frac{1}{N}\sum_{n=1}^N\!e^x_i, logN1∑n=1Neix,,
作用:降低维度,取log平均???(还不确定)