深度学习_04_1_TensorFlow2基础_Tensor数据类型&创建Tensor

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张照片的顺序打散。

  1. 生成0~63的索引,打散
  2. 根据打散后的数据按存的索引值获得照片,获得打散效果

常见应用有打散两个有对应关系的数据(同时打散),存有照片的列表和存有结果的列表之间需要有index来打散

如何实现?

  1. 假如我们有10张照片,

    idx=tf.range(10)

    打散,tf.random.shuffle(idx)

  2. 利用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代表什么类型数据的存储,变换的时候也要紧紧跟踪住每个维度具体的含义,这样就可以知道到底做了什么运算,运算的具体含义是什么。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值