张量
上一节使用的数据存储在多维的Numpy数组中,这就叫张量(tensor)
是所有机器学习的基本数据结构。
是一个数据容器,是一个数字的容器。
例如矩阵,是二维张量。
张量的维度(dimension)通常叫做轴(axis)。
标量——0D张量
仅包含一个数字的张量,叫做标量(scalar)。
在Numpy中,一个float32或者float64的数字就是一个标量张量,或标量数组。
可以用ndim来查看Numpy张量的轴数。张量轴的个数也叫作阶(rank)。
import numpy as np
x = np.array(12)
print(x)
print(x.ndim)
向量——1D张量
数字组成的数组叫做向量(vector),或者叫一维张量。
x = np.array([1,2,3,4,5])
print(x)
print(x.ndim)
矩阵(2D张量)
向量组成的数组叫矩阵(matrix),或者叫二维张量。矩阵有两个轴(行和列)。
x = np.array([[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14]])
print(x)
print(x.ndim)
上面第一个行是[1,2,3,4,5],第一列是[1,6,11]。
3D张量及更高维张量
多个2D张量组合一个数组就是一个3D张量,多个3D张量组合一个数组就是一个4D张量。以此类推。
张量关键属性
- 轴的个数。3D张量有三个轴,矩阵两个轴。张量的ndim。
- 形状。一个整数元组。表示张量延每个轴的维度大小(元素个数)。前面例子里面的矩阵的形状就是(3,5)。向量的形状只包含一个元素(5,)。标量的形状是空()。
- 数据类型。通常为float32,uint8,float64。
用MNIST看一下:
from keras.datasets import mnist
(train_image,train_labels),(test_images,test_labels) = mnist.load_data()
print(train_image.ndim)
print(train_image.shape)
print(train_image.dtype)
可以看出train_image是由8位整数,组成的3D张量。或者说是由60000个矩阵组成的数组,每个矩阵28*28个整数组成。
可以用matplotlib库来显示3D张量中的第四个数字。
import matplotlib.pyplot as plt
plt.imshow(digit,cmap=plt.cm.binary)
plt.show()
张量切片
train_image[4]来选择沿着第一个轴的特定数字,选择张量的特定元素叫做张量切片。
选择第10~100个数字(不包括100)
my_slice = train_image[10:100]
print(my_slice.shape)
沿着每个张量轴的起始到结束:
my_slice = train_image[10:100,:,:]
my_slice = train_image[10:100,0:28,0:28]
上面两个结果等同于 train_image[10:100]。:表示选择整个轴。
my_slice = train_image[:,14:,14:]
上面表示选出所有图的右下角选出14*14的区域。
my_slice = train_image[:,7:-7,7:-7]
上面表示图像中心剪出14*14的区域。