- masked_copy_(mask, source)
将mask中值为1元素对应的source中位置的元素复制到本tensor中。mask应该有和本tensor相同数目的元素。
a = torch.zeros(3, 4).byte()
index = torch.LongTensor([0])
mask = a.index_fill_(0, index, 1)
print(mask)
source = torch.randn(3, 4)
print(source)
target = torch.ones(3,4)
target.masked_scatter_(mask, source)
print(target)
tensor([[1, 1, 1, 1],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=torch.uint8)
tensor([[ 0.2118, 1.3267, 0.9646, 0.8180],
[ 1.7216, 0.4548, -1.3549, 1.5633],
[-1.1666, -0.5386, 0.2197, 0.0596]])
tensor([[0.2118, 1.3267, 0.9646, 0.8180],
[1.0000, 1.0000, 1.0000, 1.0000],
[1.0000, 1.0000, 1.0000, 1.0000]])'''
- log_sum_exp(vec, m_size), 以下两个式子得到的结果相同,后者的处理是为了防止上溢问题
vec = torch.FloatTensor([[[-1.1880, 0.2350, -1.0619],
[ 0.9061, 0.7829, -1.1289]],
[[ 0.8700, -0.6614, 1.5453],
[-0.0818, 0.7460, 3.2312]]])
res_ = torch.log(torch.sum(torch.exp(vec),1))
def log_sum_exp(vec, m_size):
"""
结果和右式相同:torch.log(torch.sum(torch.exp(vec),1))
直接计算可能会出现 exp(999)=INF 上溢问题
所以 考虑 torch.max(vec, 1)这部分, 以避免 上溢问题
Args:
vec: size=(batch_ size, vanishing_dim, hidden_dim)
m_size: hidden_dim
Returns:
size=(batch_size, hidden_dim)
"""
_, idx = torch.max(vec, 1)
max_score = torch.gather(vec, 1, idx.view(-1, 1, m_size)).view(-1, 1, m_size)
return max_score.view(-1, m_size) + torch.log(torch.sum(
torch.exp(vec - max_score.expand_as(vec)), 1)).view(-1, m_size)