张量就是多重线性函数,以下用2阶张量为例来说明pytorch的函数变换
l:V∗×V∗→R
l=∑kijei⊗ej
t = torch.Tensor([[1, 2],[3, 4]])
l=1e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2
l=∑i,j∈{1,2}l(ei∗,ej∗)ei⊗ej
torch.transpose(t, 0, 1)
[[1, 3], [2, 4]]
lout=1e1⊗e1+2e2⊗e1+3e1⊗e2+4e2⊗e2
lout=1e1⊗e1+3e1⊗e2+2e2⊗e1+4e2⊗e2
torch.cat((t, torch.Tensor([[5, 6]])), 0)
[[1, 2], [3, 4], [5, 6]]
lin2=5e3⊗e1+6e3⊗e2
lout=1e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2+5e3⊗e1+6e3⊗e2
torch.cat((t, torch.Tensor([[5], [6]])), 1)
[[1, 2, 5], [3, 4, 6]]
lin2=5e1⊗e3+6e2⊗e3
l=1e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2+5e1⊗e3+6e2⊗e3
l=1e1⊗e1+2e1⊗e2+5e1⊗e3+3e2⊗e1+4e2⊗e2+6e2⊗e3
torch.split(t, 1, 0)
[[1, 2]], [[3, 4]]
l=1e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2
lout1=1e1⊗e1+2e1⊗e2
lout2=3e1⊗e1+4e1⊗e2
torch.split(t, 1, 1)
[[1], [3]], [[2], [4]]
l=1e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2
lout1=1e1⊗e1+3e2⊗e1
lout2=2e1⊗e1+4e2⊗e1
torch.gather(t, 0, torch.tensor([[1, 0], [1, 1]]))
[[3, 2], [3, 4]]
l=1e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2
lin2=2e1⊗e1+1e1⊗e2+2e2⊗e1+2e2⊗e2
lout=∑i,j∈{1,2}l(elin2(ei∗,ej∗)∗,ej∗)ei⊗ej
lout=3e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2
torch.gather(t, 1, torch.tensor([[1, 0], [1, 1]]))
[[2, 1], [4, 4]]
l=1e1⊗e1+2e1⊗e2+3e2⊗e1+4e2⊗e2
lin2=2e1⊗e1+1e1⊗e2+2e2⊗e1+2e2⊗e2
lout=∑i,j∈{1,2}l(ei∗,elin2(ei∗,ej∗)∗)ei⊗ej
lout=2e1⊗e1+1e1⊗e2+4e2⊗e1+4e2⊗e2