张量

什么是张量?

一个数,一个数组,一个矩阵都是张量。

张量包含多个属性,下面我将进行介绍。

 

张量的维度,叫做轴(axis)。维度可以无限扩充。

查看张量维度:

>>> x.ndim

标量(0D张量)

对应的是数值,例如1,2,3等。

向量(1D张量)

我们传统理解上的向量是(0,1)、(256,256)等,但这里向量相当于所谓一维数组。

>>> x = np.array([12,3,6,14,7])
>>> x.ndim
1

矩阵(2D张量)

[ [ 1, 2, 3, 4 ] , 

  [ 5, 6 ,7 ,8 ] ]

[ ] 代表是一个集体,单个 [ ] 存的是向量,[ ] 中多个 [ ] 相当于多个向量罗列,也就表示成我们的矩阵。

>>> x = np.array( [ [ 1, 2, 3, 4 ] , 
                    [ 5, 6 ,7 ,8 ] ,
                    [ 1, 2, 3, 4 ] ] )
>>> x.ndim
2

3D张量与更高维张量 

一个矩阵看作一个面,多个矩阵叠加,便成了立体(3D)。

>>> x = np.array( [ [ [ 1,2,3,4 ] ,
                      [ 2,3,4,5 ] ] ,
                    [ [ 4,3,2,1 ] ,
                      [ 1,2,3,4 ] ] ])
>>> x.ndim
3

 

张量除了维度以外,还包含其他两个属性:

  • 形状(shape)
  • 数据类型(dtype)

查看张量形状:

例如,某一个3D张量x

>>> print(x.shape)
(600,28,28)

相当于600层28*28矩阵的叠加。

举一个特殊的例子:128张彩色图片。

彩色图片一般是RGB三原色构成,假定每一张的大小为256*256,则:

>>> print(x.shape)
(128,256,256,3)    #tTensorFlow标准:(samples, height, width, color_depth)
                   #如果是Theano:   (samples, color_depth, height, width)
                   #Keras同时支持两种格式

3代表的是“颜色通道”,这里对应的就是RGB三原色。如果是灰度图片,则为1。

 

查看张量数据类型:

>>> print(x.dtype)
unit8

表示的是8位整型。

常见的数据类型:

float32 float64 char ...

注意:Numpy以及大多数库,不存在字符串张量,因为张量存储在预先分配的连续内存中,而字符串的长度是可变的,无法用这种方式存储。

 

 

张量操作中有一个疑问:

我们的数组是(90,28,28),如果想取出所有图片右下角14*14像素的区域:

my_slice = train_image[:, 14:, 14:]

而书上说也能使用负数:(取中心14*14的图像)

my_slice = train_image[:, 7:-7, 7:-7]

是说正负表示相对于轴的位置,同时轴到了中心位置,但前面那个方法的理解,好像并不需要用到轴。

所以,是只有在用到负索引的时候,才把轴放在中心,而一般情况不考虑轴吗?

其实这里很简单:

python张量分解 python张量运算_3D

正数是从前往后数的,负数代表从后往前数。

[7:-7] 表示不要前7个,不要最后7个,因为大小是28,所以只剩下了中间14个。