04_1_TensorFlow2基础_Tensor数据类型&创建Tensor
Tensor数据类型
一些概念
Data Container(数据载体)
-
list
优点:可以添加任何类型的数据
-
np.array
-
tf.Tensor
和numpy类似,这是更适合GPU运算。
What’s Tensor?
-
scalar(标量):1.1
dimension = 0
-
vector(向量):[1.1], [1.1,2.2, …]
dimension = 1
-
matrix(矩阵):[ [1.1,2.2] , [3.3,4.4] , [5.5,6.6] ]
-
tensor:rank(维度) > 2
在TensorFlow中,把所有维度大于等于1都叫做tensor,甚至是scalar
因此tensor一般是指所有的数据
Tensor Flow in Graph
很多的数据经过输入输出的一系列操作,像水流一样沿着管道完成运算。从宏观来看,整个流程几乎就像Tensor(数据)在管道Flow一样,因此叫TensorFlow。上图是一个分类问题。
TF is a computing lib(计算库)
TensorFlow中Tensor基本的数据类型:int、float、double、bool、string
Create(初始化)
#常量(普通的Tensor)
#int32的1
tf.constant(1)
#float32的1
tf.constant(1.)
#double的2,double对应的是float64(别名)
tf.constant(2.,dtype=tf.double)
#bool类型
tf.constant([True,False])
#string类型
tf.constant('hello,world.')
Tensor Property(属性)
#返回当前Tensor所在设备的名字str
a.divice
#将数值转移到CPU或GPU,在哪个地方就使用哪个地方的操作
aa = a.gpu()
bb = b.cpu()
#转换成numpy
b.numpy()
#查看Tensor的shape
b.shape()
#查看维度,例如返回1(数字)
b.ndim()
#查看维度,与上面不同的是返回Tensor对象
tf.rank()
Check Tensor Type(判断是否是Tensor)
#判断数值是否是Tensor
isinstance(a,tf.Tensor)
tf.is_tensor(b)
a.dtype == tf.float32
Convert(类型转换)
#从numpy新建的整数(int64)转换为Tensor类型时dtype也是int64
a = np.arange(5) #array([0,1,2,3,4])
aa = tf.convert_to_tensor(a) #dtype=int64
#转换成int32
aa = tf.convert_to_tensor(a,dtype=tf.int32)
tf.cast(aa,dtype=tf.float32或tf.double或tf.int32)
bool<->int
tf.Variable
我们以linear regression为例,y=wx+b。
x和y都是Tensor类型,但是w和b都是需要被梯度优化的参数,所以它除了是Tensor类型以外,它还有一个额外的属性,叫做Variable。
w=tf.Variable(w)
w本身是Tensor类型,我们把Tensor再包了一个tf.Variable。
包装后,就自动具备了一些可求导的特性,w/b:trainable(可训练的,需要梯度信息) -> 需要 δ l o s s / δ w \delta loss/ \delta w δloss/δw
程度会自动对Variable类型进行梯度信息的跟踪(记录)。
它是专门神经网络的参数所设计的类型
ininstance(b,tf.Tensor) #False
tf.is_tensor(b) #True
因此建议用is_tensor和dtype判断类型
To numpy
int(Tensor)
:转化为int
float(Tensor)
:转化为float
创建Tensor
- from numpy, list
- zeros, ones
- fill
- random
- constant
- 用Application(具体案例)
From numpy, list
按逻辑转换,如果列表中有数也有字符串则会报错
tf.convert_to_tensor(np.ones[2,3])
tf.convert_to_tensor([1,2])
tf.zeros
#这里的参数表示shape,而不是列表(值data)
#新建标量0
tf.zeros([])
#一维Vector [0.]
tf.zeros([1])
#二维
tf.zeros([1,2])
td.zeros_like
根据传入Tensor的shape新建对应的shape Tensor,但是元素全为0
tf.zeros_like(a) = tf.zeros(a.shape)
tf.ones、ones_like
元素默认全为1,和zeros、zeros_like类似
在一般情况下,对wx+b的模型,把b全部初始化为0,w初始化为1 或 随机初始化(更常见)
Fill
填充任意元素的值
tf.fill([2,2],0)
Normal(正态分布)
tf.random.normal([2,2],mean=1,stddev=1)
shape,mean均值,stddev方差。默认为mean0,stddev1的正态分布
上图为从N(1,1)分布sample出2行2列的Tensor
tf.random.truncated_normal([2,2],mean=0,stddev=1)
截断的正态分布,在原来分布的基础上面,截去某个部分的元素
使用truncated_normal可能比normal性能更好一些
Truncated Distributiom
截断表示把一部分截去,比如说截去红色的部分,重新采样
红线为SIGMOD激活函数,当到达这个(左边和右边)区域以后,区域的梯度非常平坦。这种现象叫做梯度离散或者梯度消失(Gradient Vanish)
Uniform(均匀分布)
tf.random.uniform([2,2],minval=0,maxval=1)
minval~maxval之间进行采样
还可以指定的dtype,如果是整型,可以从0,1,2,3,4…9,10,每个数字都有等同的概率被sample到。
Random Permutation(随机打散)
例如有[64,28,28,3],把64张照片的顺序打散。
- 生成0~63的索引,打散
- 根据打散后的数据按存的索引值获得照片,获得打散效果
常见应用有打散两个有对应关系的数据(同时打散),存有照片的列表和存有结果的列表之间需要有index来打散
如何实现?
-
假如我们有10张照片,
idx=tf.range(10)
打散,
tf.random.shuffle(idx)
-
利用idx,从a和b列表中拿数据:
a=tf.gather(a,idx)
b=tf.gather(b,idx)
tf.constant
和conver_to_tensor类似
传入的维度必须要一样:[ [1,2] , [3.] ] 错
Typical Dim Data(典型的应用)
Scalar(标量)
[]
-
loss
简单的例子:
第一部分是生成一个类似图片集
第二部分生成图片的结果标签,并且one-hot编码,第0个为0,最后一个为3
第三和四部分计算loss,并且batch=4,计算出4个loss,加起来除以4算出平均loss,最后loss的shape=(),就是scalar
-
accuracy
都是具体的数值,标量
Vector
bias(b参数),x @(矩阵相乘) w + b,b就是Vector,维度是output的维度,如果结果是0,1,2,…9,那么b是dimension为1,shape为10的Tensor。
上图的Dense是把8维转化成10维的
bias是b参数,维度为1,shape为10的Tensor,默认全部初始化为10
kernel是w参数,shape=[8,10],很好理解,为了让[4,8] @ [8,10] + [10]的结果为[1,10],kernel的初始化方式比较随机化
Matrix
矩阵。刚刚的w是[8,10],input[b,784],这两个都是dimension为2,不同shape的Tensor。
具体的例子。我们有4张照片,每张照片28*28打平;再经过一个维度为10转化的过程。经过网络后得到4张照片,每张照片10。kernel的dimension为2,bias的dimension为1。
Dim=3 Tensor
3维的Tensor,它在自然语言处理中运用非常广泛,x[句子,句子词数,词的编码]
Dim=4 Tensor
4维Tensor,图片的保存方式。对于MNIST是[b,28,28,1];对于普通的RGB三个通道的图片,[1或b,height,weight,3]
卷积层,channel从3变成16
Dim=5 Tensor
meta-learning:把一个数据集分割成多个任务,task_b表示有4个任务,每个任务有[64,28,28,1]。
维度再高的话比较少见,只要我们知道每个维度的具体含义,我们去理解它的时候就会知道Tensor代表什么类型数据的存储,变换的时候也要紧紧跟踪住每个维度具体的含义,这样就可以知道到底做了什么运算,运算的具体含义是什么。