https://www.cnblogs.com/douzujun/p/10289560.html
https://blog.csdn.net/fangjian1204/article/details/53055219
转载自:
https://blog.csdn.net/holmes_mx/article/details/82813865
如何理解深度学习中的tensor(涉及numpy的二维,三维以及四维数据的理解)
作者:
自己加的一些理解:
import numpy as np
c = [ [[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [1.0, 1.1, 1.2]],
[[0.11, 0.21, 0.31], [0.41, 0.51, 0.61], [0.71, 0.81, 0.91], [1.01, 1.11, 1.21]] ],
[[[0.12, 0.22, 0.32], [0.42, 0.52, 0.62], [0.72, 0.82, 0.92], [1.02, 1.12, 1.22]],
[[0.112, 0.212, 0.312], [0.412, 0.512, 0.612], [0.712, 0.812, 0.912], [1.012, 1.112, 1.212]]]
]
c_array = np.array( c )
print( c_array )
print( c_array.shape )
c_array_1 = c_array.transpose(0,2,3,1)
print( c_array_1 )
print( c_array_1.shape )
N,H,W,C = c_array_1.shape
c_array_2 = c_array_1.reshape(N*H*W,C)
print( c_array_2 )
print( c_array_2.shape )
[[[[0.1 0.2 0.3 ]
[0.4 0.5 0.6 ]
[0.7 0.8 0.9 ]
[1. 1.1 1.2 ]]
[[0.11 0.21 0.31 ]
[0.41 0.51 0.61 ]
[0.71 0.81 0.91 ]
[1.01 1.11 1.21 ]]]
[[[0.12 0.22 0.32 ]
[0.42 0.52 0.62 ]
[0.72 0.82 0.92 ]
[1.02 1.12 1.22 ]]
[[0.112 0.212 0.312]
[0.412 0.512 0.612]
[0.712 0.812 0.912]
[1.012 1.112 1.212]]]]
(2, 2, 4, 3)
[[[[0.1 0.11 ]
[0.2 0.21 ]
[0.3 0.31 ]]
[[0.4 0.41 ]
[0.5 0.51 ]
[0.6 0.61 ]]
[[0.7 0.71 ]
[0.8 0.81 ]
[0.9 0.91 ]]
[[1. 1.01 ]
[1.1 1.11 ]
[1.2 1.21 ]]]
[[[0.12 0.112]
[0.22 0.212]
[0.32 0.312]]
[[0.42 0.412]
[0.52 0.512]
[0.62 0.612]]
[[0.72 0.712]
[0.82 0.812]
[0.92 0.912]]
[[1.02 1.012]
[1.12 1.112]
[1.22 1.212]]]]
(2, 4, 3, 2)
[[0.1 0.11 ]
[0.2 0.21 ]
[0.3 0.31 ]
[0.4 0.41 ]
[0.5 0.51 ]
[0.6 0.61 ]
[0.7 0.71 ]
[0.8 0.81 ]
[0.9 0.91 ]
[1. 1.01 ]
[1.1 1.11 ]
[1.2 1.21 ]
[0.12 0.112]
[0.22 0.212]
[0.32 0.312]
[0.42 0.412]
[0.52 0.512]
[0.62 0.612]
[0.72 0.712]
[0.82 0.812]
[0.92 0.912]
[1.02 1.012]
[1.12 1.112]
[1.22 1.212]]
(24, 2)
1. 二维数据的理解
理解为:只有(Height, Width),而且理解的是对于每一【 】从后向前看。即第一个[0.1, 0.2, 0.3]是width维度的。
b = [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]
b_array = np.array( b )
print(b_array)
print(b_array.shape)
print( b_array[1,2] )
### result
[[0.1 0.2 0.3]
[0.4 0.5 0.6]]
(2, 3)
0.6
2. 对三维数据的理解
理解为:只有(Height, Width, Channel),而且理解的是对于每一【 】从后向前看。即第一个[1, 2, 3, 3.5]是Channel维度的。
a = [ [[1, 2, 3, 3.5], [4, 5, 6, 6.5]],
[[7, 8, 9, 9.5], [10, 11, 12, 12.5]],
[[13, 14, 15, 15.5], [16, 17, 18, 18.5]]]
a_array = np.array( a )
print(a_array)
print( a_array.shape )
print( a_array[0, 1, 3] )
### result
[[[ 1. 2. 3. 3.5]
[ 4. 5. 6. 6.5]]
[[ 7. 8. 9. 9.5]
[10. 11. 12. 12.5]]
[[13. 14. 15. 15.5]
[16. 17. 18. 18.5]]]
(3, 2, 4)
6.5
可视化上述的三维数据(字迹丑大家见谅,理解原理优先):
3. 对四维数据的理解
理解为:(Batch_size, Height, Width, Channel),而且理解的是对于每一【 】从后向前看。即第一个[0.1, 0.2, 0.3]是Channel维度的。
c = [ [[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [1.0, 1.1, 1.2]],
[[0.11, 0.21, 0.31], [0.41, 0.51, 0.61], [0.71, 0.81, 0.91], [1.01, 1.11, 1.21]] ],
[[[0.12, 0.22, 0.32], [0.42, 0.52, 0.62], [0.72, 0.82, 0.92], [1.02, 1.12, 1.22]],
[[0.112, 0.212, 0.312], [0.412, 0.512, 0.612], [0.712, 0.812, 0.912], [1.012, 1.112, 1.212]]]
]
c_array = np.array( c )
print( c_array )
print( c_array.shape )
print( c_array[1, 0, 3, 1] )
## result
[[[[0.1 0.2 0.3 ]
[0.4 0.5 0.6 ]
[0.7 0.8 0.9 ]
[1. 1.1 1.2 ]]
[[0.11 0.21 0.31 ]
[0.41 0.51 0.61 ]
[0.71 0.81 0.91 ]
[1.01 1.11 1.21 ]]]
[[[0.12 0.22 0.32 ]
[0.42 0.52 0.62 ]
[0.72 0.82 0.92 ]
[1.02 1.12 1.22 ]]
[[0.112 0.212 0.312]
[0.412 0.512 0.612]
[0.712 0.812 0.912]
[1.012 1.112 1.212]]]]
(2, 2, 4, 3)
1.12
4. tensor的简单操作
4.1 numpy 中对tensor的操作
以三维tensor为例:
numpy.sum( tensor, axis ) numpy.mean( tensor, axis)
其中axis = -1是对最里面的一个维度操作。如numpy.sum( tensor, axis = -1 ), 即对第2维度进行操作,即对channel进行相加。
实例为:
import numpy as np
a = [[[1, 2, 3,], [4, 5, 6]], [[1.1, 2.1, 3.1], [4.1, 5.1, 6.1]]]
print( np.sum(a, axis=-1) )
print( np.sum(a, axis=0) )
print( np.sum(a, axis=1) )
print( np.sum(a, axis=2) )
## output
#axis = -1 ## channel
[[ 6. 15. ]
[ 6.3 15.3]]
# axis = 0 ## height
[[ 2.1 4.1 6.1]
[ 8.1 10.1 12.1]]
# axis = 1 ## width
[[5. 7. 9. ]
[5.2 7.2 9.2]]
# axis = 2 ## channel
[[ 6. 15. ]
[ 6.3 15.3]]