目录
1. 两个矩阵做@ 运算:
做的是矩阵乘法!(而普通的*则是逐元素相乘)。eg:
blender2opencv = np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
transform_matrix = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[ 13,14,15,16]])
pose=transform_matrix @ blender2opencv
print(pose)
pose2=np.matmul(transform_matrix, blender2opencv)
print(pose2)
输出结果相同
2. 模块Transforms里面的ToTensor函数:
这个模块的主要作用主要就是将PIL或者numpy.ndarry的图像类型转变成tensor的类型格式。
3. np.newaxis:
将数组维度扩张,且扩张的那一维度的尺寸是1.
4. numpy中冒号与省略号的区别:
:表示某一维的所有数据;
…: 表示余下所有维的所有数据。
如:三维张量a。
a[0,:]=a[0,:,:]
a[0,...]=a[0,:,:]
a[:,0]=a[:,0,:]
a[...,0]=a[:,:,0]
5. torch.repeat
沿着特定的维复制张量。
x = torch.tensor([1, 2, 3])
>>> x.repeat(4, 2)
tensor([[ 1, 2, 3, 1, 2, 3],
[ 1, 2, 3, 1, 2, 3],
[ 1, 2, 3, 1, 2, 3],
[ 1, 2, 3, 1, 2, 3]])
6. torch.rand_like(input)
返回和input一样size的张量,内容是服从(0,1)正态分布的数据。
7. None在一个向量(矩阵、张量)中的应用
简单来说就是增加一个新的维度。
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)
print(a.shape)
b=a[...,None]
print("b的形状:",b.shape)
c=a[...,None,:]
print(c.shape)
print(c)
# 输出结果
[[1 2 3]
[4 5 6]
[7 8 9]]
(3, 3)
b的形状: (3, 3, 1)
(3, 1, 3)
[[[1 2 3]]
[[4 5 6]]
[[7 8 9]]]
8. 发现在python中两个维数不符的矩阵做乘法——对应元素相乘
eg:
m=np.array([1,2,3])
n=np.array([[1],[2],[3],[4],[5]])
m*n
# 输出结果
array([[ 1, 2, 3],
[ 2, 4, 6],
[ 3, 6, 9],
[ 4, 8, 12],
[ 5, 10, 15]])
9. view函数
Tensor.view(*shape) → Tensor。就是将张量改造成不同的形状。
eg:
x=torch.tensor([[1,2,3],[4,5,6]])
print(x.view(1,6))
print(x.view(-1,2))
print(x.view(3,2))
# 输出结果
tensor([[1, 2, 3, 4, 5, 6]])
tensor([[1, 2],
[3, 4],
[5, 6]])
tensor([[1, 2],
[3, 4],
[5, 6]])
10.cat函数
Tensor.view(*shape) → Tensor
就是将几个size一样的张量沿着给定的维度拼接起来。
eg:
x=torch.tensor([[1,2,3],[4,5,6]])
y=torch.cat((x,x,x),0)
print(y)
z=torch.cat((x,x,x),1)
print(z)
# 输出结果
tensor([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
tensor([[1, 2, 3, 1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6, 4, 5, 6]])
11. detach函数
返回一个新的tensor,从当前计算图中分离下来的,但是仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个tensor永远不需要计算其梯度,不具有grad。这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播。
注意:使用detach返回的tensor和原始的tensor共同一个内存,即一个修改另一个也会跟着改变。
12. F.grid_sample函数
output=F.grid_sample(input, grid)
简单来说就是,提供一个input的Tensor以及一个对应的flow-field网格(比如光流,体素流等),然后根据grid中每个位置提供的坐标信息(这里指input中pixel的坐标),将input中对应位置的像素值填充到grid指定的位置,得到最终的输出。
解释的参考文档
13. F.softplus函数
一个比relu光滑的激活函数。长这样:
14. comprod函数
是一个算累乘的函数。
eg:
a=torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
print(torch.cumprod(a,dim=0))
print(torch.cumprod(a,dim=1))
# 输出结果
tensor([[ 1, 2, 3],
[ 4, 10, 18],
[ 28, 80, 162]])
tensor([[ 1, 2, 6],
[ 4, 20, 120],
[ 7, 56, 504]])