TesorFlow03-TesorFlow的基础

发布时间 2023-06-15 22:29:20作者: 哎呦哎(iui)

1 TesorFlow的数据结构

list :[1,1.2,'Hello',(1,2)] ,这个list里面什么都可以存储,但是如果存储一个图片[64,32,32,3]里面全是数字的话,大小会很大,所以引入np.array
np.array :可以很方便的做一些同类型的数据的运算,比如加、减、乘、除、转置。但是有一个致命的弱点,就是np是在深度学习之前就设计好的库函数,所以他没有GPU的支持很慢,也没有求导
tf.Tensor :
scalar 是一个标量,dim=0,然后vector是一个一维数组dim=1
image
TF支持的计算类型:
▪ int, float, double
▪ bool
▪ string

1.1 常见数据类型的创建

#创建一个常量
tf.constant(1)
#创建一个浮点数常量,这里默认是float32类型
tf.constant(1.)
#创建一个double型常量
tf.constant(2.,dtype=tf.double)
#创建一个bool类型的常量
tf.constant([True,False])
#创建一个string类型的常量
tf.constant('Hello World')

image

1.2 tensorflow变成numpy

.numpy()函数

c=tf.range(5)
c.numpy()
#查看c的维度
c.ndim

image

1.3 rank函数

这个也是返回维数的比如说
其中tf.ones([3,4,2])是弄一个三维的数组
image

1.4 检验函数是不是tensor类型

tf.is_tensor(t)

image
image

1.5 numpy转化成tensor

aa=tf.conver_to_tensor(a)

a=np.arange(5)
aa=tf.conver_to_tensor(a)

image
如果转化的时候想改变类型的话

bb=tf.convert_to_tensor(a,dtype=np.int64)

image

1.6 tensor中数据的相互转化

API:
tf.cast(aa,tf.float32)就是把aa里面的数变成float32

tf.cast(bb,tf.float32)
tf.cast(bb,dtype=tf.double)
tf.cast(bb,dtype=tf.int32)

image
我们后面比较常见的就是整形和bool型之间的转化

b=tf.constant([0,1])
tf.cast(b,dtype=tf.bool)
#输出:<tf.Tensor: shape=(2,), dtype=bool, numpy=array([False,  True])>
tf.cast(b,dtype=tf.int32)

image

1.7 Variable 类型

这个是专门为神经网络设计的一个类型,比如收y=w*x+b这个函数,我们在求梯度下降的时候会对w进行求导,所以我们可以将w设置成Variable类型,这样它进行梯度关系的一个跟踪,如果记录成Variable 就会自动的进行一些梯度的记录

image

2 创建tensor

其中方法有很多:
▪ from numpy, list
▪ zeros, ones
▪ fill
▪ random
▪ constant

2.1 from numpy,list

API:
conver_to_tensor()

tf.convert_to_tensor(np.ones([2,3]))
#这里创建的默认是float64类型的
tf.convert_to_tensor(np.zeros([2,3]))
#这里创建的默认是float64类型的

image

2.2 zeros, ones

tf.zeros()这个里面是维度
tf.ones()这个里面也是维度

注意这个括号里面的是维度,不如tf.zeros([2,2])这是创建了一个两行两列的0

tf.zeros([])
#这里就是一个标量0.
tf.zeros([2,3,4])
#这是一个三维的

image

2.3 tf.zeros.like(),tf.ones.like()

比如说这个tf.zeros.like(a),就是创建了一个和a形状相同的但是全0的矩阵,等价于tf.zeros.like(a.shape)
image

这个tf.zeros.like(),tf.ones.like(),tf.zeros(),tf.ones()用处是非常广泛的,比如y=wx+b,w通常都初始化为全1,b初始化为全0

2.4 fill

顾名思义,就是填满的意思

tf.fill([n,m],k)
意思就是用k填满这个[n,m]的矩阵

image

2.5 random(常见)

这个是创建一个随机数组,这个最常见其中包含正态分布,
1.正态分布

tf.random.normal([n,m],mean=1,stddev=1)
n行m列,然后均值mean为1,方差stddev为1
不指定的话就是01分布

tf.random.truncated_normal([2,2],mean=1,stddev=1)这是一个截断了的正态分布,有时候使用这个会好一点

tf.random.normal([2,2],mean=1,stddev=1)
tf.random.truncated_normal([2,2],mean=1,stddev=1)

image

2.均匀分布

tf.random.uniform([n,m],minval=,maxval=)
这个就是在minval和maxval之间均匀取样n行m列的数组

tf.random.uniform([2,2],minval=0,maxval=1)
tf.random.uniform([2,2],minval=0,maxval=10)

image

2.6 应用(random Permutation)

这个是将一个数组再重新打乱
image

2.7 tf.constant函数

就是这个和conver_to_tensor是一样的
image

3 存在意义

3.1 Scalar(标量)

image
image
这个里面的shape=()就是标量

3.2 Vector(向量)

image
其中这个x@w+b,这个b就是一个vector
image

3.3 Matrix(矩阵)

image
image

3.4 Dim=3 Tensor

这个在自然语言用的比较多,一个单词5个特征,1句话80个单词。
image

image

3.5 Dim=4 Tensor

这个通常对应图片,多张图片是[b,h,w,c],b是代表多张图片,h高,w宽,c什么样的图片,c=3彩色的
image

image

3.6 Dim=5 Tensor

image

4 Tensor 的索引和切片

▪ Basic indexing
-------1.[idx][idx][idx]
▪ Same with Numpy
-----1.[idx, idx,…]
-----2.start:end
-----3.start:end :step

4.1 基本索引(Basic indexing)

4.1.1 [,,,],索引

在这里如果我们想访问的时候一般不用[][],一般用[,,,]。
例如:

a=tf.random.normal([4,28,28,3])
a[1].shape #一般代表第二张照片的信息
=>[28,28,3]
a[1,2].shape #代表
=>[28,28]
a[1,2,3].shape
=>[3]
a[1,2,3,2].shape #代表某一张图片的像素,一般为0-256,或者标准化后的图像

4.1.2 start:end

在这里从前向后数第一个为0,从后往前数第一个为-1,但是注意这里是左闭右开的
image
扩展到高维中去:a[0,:,:,:]就是第一张图片的全部信息,a[:,:,:,0]单通道的
image

4.1.3 start:end :step

隔行取样,设置步长state?step或者::step
注意这里是每个维度都可以这样弄的,比如:

a[0:2,:,:,:].shape
a[:,0:28:2,0:28:2,:].shape
a[:,::2,::2,:].shape

image

这里需要注意的是如果step为负值的话,代表这个倒着采样
如果是[::-1]的话就是把数组倒序
[::-2],就是倒着隔着采样
image

4.1.4 ...方式

其实这个"..."就是一个省略表示。
比如:a[2,4,28,28,3]
a[0,:,:,:,:]=>a[0,...]
a[:,:,:,:,0]=>a[...,0]
a[0,...,2]也是可以的

image

4.2 选择索引(Selective Indexing)

▪ tf.gather
▪ tf.gather_nd
▪ tf.boolean_mask

4.2.1 tf.gather

假如说[4,28,28,3],在第二维我们想采样[3,27,9,13]这些无规则行,怎么办?

tf.gather(a,axis,indices=[])其中a为目标函数,axis是第几维(比如[2,35,8]中axis=1,的话就是去第1维,35的那个),indices=[],这个就是要取得编号)

例如:data:[classes,student,subjects]其中[4,35,8]
image
例如:

tf.gather(a,axis=0,indices=[2,3]).shape
#上面那个是在班级的维度上,采集了下标是2,3班的全部学生的信息,返回[2,35,8],等价于a[2:4].shape
tf.gather(a,axis=0,indicces=[2,1,4,0])#这样还是那些信息但是不是那个顺序了
tf.gather(a,axis=1,indices=[2,3,7,9,16]).shape#这是在第学生的维度进行采样,也就是取全部班级的[2,3,7,9,16]的全部科目的成绩

image

4.2.2 tf.gather_nd

上面我们都是在一个维度任意取,其他维度都得保留,但是我如果我想取第2个学生的第0门课,第3个学生的第4门课,第8个学生的第二门课,怎么取呢?
image
上面是在两个维度进行操作。
image
单个条件
比如说:[4,35,8]

tf.gather_nd(a,[0]).shape
#这个就相当于a[0,::],就是第一个班级的全部同学的成绩,返回[35,8]
#其实这里是(a,[[0]]),由于只取了一种所以外面的大括号省了
tf.gather_nd(a,[0,1]).shape
#这里就是取a中的相当于a[0,1,:],就是取第一个班级的第二个学生的全部成绩,返回TensorShape[8]
tf.gather_nd(a,[0,1,2]).shape
#返回一个数,第一个班级的第二个学生的第三门课的成绩
tf.gather_nd(a,[[0,1,2]]).shape
#上面两个不一样,第二个返回一个长度为一的数据

image
多个条件
比如说:

tf.gather_nd(a,[[0,0],[1,1]]).shape
这是返回的两个[8]的vector,所以是一个[2,8]
tf.gether_nd(a,[[0,0,0],[1,1,1],[2,2,2]]).shape
#这里是三个同学的成绩所以返回一个TensorShape[3]

但是这个注意看于上面的区别

tf.gether_nd(a,[[[0,0,0],[1,1,1],[2,2,2]]]).shape
#这里面返回的是一个[1,3],因为它多加了一个[]

image

这里比较建议的是:如果是一个条件的话用这个[[0]],这样返回[1,35,8],最后把1消掉就行

▪ recommended indices format:
▪ [[0], [1],…]
▪ [[0,0], [1,1],…]
▪ [[0,0,0], [1,1,1],…]