第四章tensoflow基础

        TensorFlow是一个面向深度学习算法的科学计算库,内部数据 保存在张量(Tensor)对象上,所有的运算操作(Operation,简称OP) 也都是基于张量对象进行的,所以tensoflow的基础就是关于张量的操作学习。

        一.张量?

                TensorFlow中的张量(Tensor)是多维数组的扩展,是该框架的核心数据结构之一。张量可以表示各种类型的数据,如

1.标量:单 个 的 实 数 , 如 1.2 , 3.4 等 , 维 度 (Dimension)数为0,shape为[ ]。

2.向量:n个实数的有序集合,通过中括号包裹,如 [1.2],[1.2,3.4]等,维度数为1,长度不定,shape为 [n]

3.矩阵:n行m列实数的有序集合,如[[1,2],[3, 4]],也可以写成 维度数为2,每个维度上的长度不定,shape为[n,m]

4.多维张量:所有维度数>2的数组统称为张量。张 量的每个维度也作轴(Axis),一般维度代表了具体的物理 含义

二.如何创建张量

        tf.constant()函数进行张量的创建

        

       

由输出结果可见,a是一个shape[]为0的标量,b是一个shape[2]为2的向量,c是一个2x3的矩阵shape[2,3]

三.字符串的数据表示

在tf.strings模块中,提供了常见的字符串类型的工具函数,如小写化 lower()、拼接join()、长度length()、切分split()等

1.join()

x是一个长度为2的向量,使用tf.strings.join指定以,为拼接符将hello和tensorflw拼接起来,成为一个标量

若分隔符为空则直接将两个字符串拼接

2.split()

创建一个字符型张量,以,为分隔符,将标量切开成为一个二维向量

3.lower()和upper()

用tf.strings.lower()变小写,tf.strings.upper()变大写

四.布尔型的数据表示

     为了方便表达比较运算操作的结果,TensorFlow还支持布尔类 型(Boolean,简称bool)的张量。布尔类型的张量只需要传入Python 语言的布尔类型数据,转换成TensorFlow内部布尔型即可,例如:

五.读取精度

对于数值类型的张量,可以保存为不同字节长度的精度,如浮点 数3.14既可以保存为16位(bit)长度,也可以保存为32位甚至64位的 精度。位越长,精度越高,同时占用的内存空间也就越大。常用的精 度类型有tf.int16、tf.int32、tf.int64、tf.float16、tf.float32、 tf.float64等

保存的精度过低数据则会发生溢出,默认情况下,张量的精度是tf.float32,即单精度浮点数。如果需要更高的精度,可以使用tf.float64,即双精度浮点数。

通过访问张量的dtype成员属性可以判断张量的保存精度,例 如:

对于某些只能处理指定精度类型的运算操作,需要提前检验输入 张量的精度类型,并将不符合要求的张量进行类型转换。

六.类型的转换

系统的每个模块使用的数据类型、数值精度可能各不相同,对于 不符合要求的张量的类型及精度,需要通过tf.cast函数进行转换,例 如:

类型转换可能会引起精度的损失或溢出,在转换过程中,确保选择合适的目标数据类型,以保持数据的准确性和一致性。

六.待优化张量

        在TensorFlow中,可以使用tf.Variable对象来表示待优化的张量。tf.Variable是可以被优化的可变张量,通常用于表示模型的参数。

        一般情况下,我们使用tf.Variable来定义模型的权重(weights)和偏置(biases)。这些变量会在训练过程中进行优化,以使模型适应给定的训练数据。

上述代码中,我们使用tf.Variable来定义了一个形状为(10, 20)的权重矩阵和一个形状为(20,)的偏置向量。通过打印weights张量,我们可以看到其类型为tf.Variable,并存储了该张量的值。在模型训练过程中,通过优化算法来更新weightsbiases的值。

七.创建张量

1.从数组,列表对象创建

        除了使用tf.constant创建张量以外,还可以使用tf.convert_to_tensor函数创建张量:

2.创建全0和全1张量

        将张量创建为全0或者全1数据是非常常见的张量初始化手段

        使用tf.zeros()创建一张全0张量,tf.ones()创建一张全1张量,

        创建时可以指定其形状

        

        

3.创建自定义数值张量

        在TensorFlow中,可以使用tf.fill函数创建一个指定形状且填充有指定值的张量。该函数接受一个形状参数和一个值参数。

4.创建已知分布向量

        在TensorFlow中,tf.random模块提供了许多用于生成随机数的函数和工具。这些函数可以用于生成不同分布的随机张量,用于初始化模型参数、数据增强和随机化等应用。

一些常用的tf.random模块函数包括:

  1. tf.random.uniform:生成均匀分布的随机张量。
  2. tf.random.normal:生成正态分布的随机张量。
  3. tf.random.truncated_normal:生成截断正态分布的随机张量。
  4. tf.random.shuffle:随机打乱张量的顺序。
  5. tf.random.set_seed:设置全局或局部随机种子。

输出结果显示了生成的随机张量的形状、数据类型和数值。认情况下,这些函数生成的随机张量的数值是根据系统的随机数生成器来确定的。如果需要可重复的随机数序列,可以使用tf.random.set_seed函数设置全局或局部的随机种子。

5.创建序列

        通过使用tf.range函数,我们可以生成一个按指定范围和步长递增的整数张量。

     

    

使用tf.range()生成一个连续的序列,通过start参数设置起始值为0,limit参数设置结束值为10(不包括10),delta参数设置步长为1。tf.range函数默认情况下生成的张量是按照整数类型(tf.int32)创建的。可以通过dtype参数来指定生成的张量的数据类型。

八.维度转换

        维度转换在数据处理和模型构建中非常重要,可以将数据转换为我们需要的类型。比如在进行数据处理、特征工程或模型输入时,可能需要将数据调整为特定的形状或维度,以满足模型的要求;构建深度学习模型时,经常需要将输入数据的形状调整为合适的维度;

        基本的维度变换操作函数包含改变视图reshape、插入新维度 expand_dims、删除维度squeeze、交换维度transpose、复制数据 tile等函数。

        1.tf.reshape(x,new_shape)(改变视图)

# 定义一个张量
tensor = tf.constant([[1, 2, 3], [4, 5, 6]])

# 改变张量的形状
reshaped = tf.reshape(tensor, (3, 2))
print(reshaped)

 

原tensor是一个2x3的矩阵,利用reshape改变视图后便成为了3x2的矩阵

2.tf.expand_dims(x,axis)(插入新维度)

# 定义一个张量
tensor = tf.constant([1, 2, 3])
print(tensor)
# 在指定的维度上插入一个新维度
expanded = tf.expand_dims(tensor, axis=1)
print(expanded)

 

可见原tensor是一个shape [3]的维度,通过tf.expand_dims操作,在第一个维度上插入了一个新的维度。新的张量形状变为shape[3,1]。

3.tf.squeeze(x, axis, name)(删除维度)

# 定义一个张量
tensor = tf.constant([[[1], [2], [3]]])
print(tensor)
# 减少张量的维度
squeezed = tf.squeeze(tensor)
print(squeezed)

  

可见原tensor维度为shape [1,3,1]经过删除维度tf.squeeze后维度变为了shape[3],squeeze操作默认只会删除为1的维度,也可以指定axis来指定删除的维度

4.tf.transpose(x, perm, conjugate=False, name='transpose')(交换维度)

# 定义一个形状为(2, 3)的张量
tensor = tf.constant([[1, 2, 3], [4, 5, 6]])
print(tensor)
# 转置张量
transposed = tf.transpose(tensor)
print(transposed)

  

可见原tensor维度为shape[2,3],经过交换维度后变为了shape [3,2],如果未指定perm参数,tf.transpose函数将默认交换张量的最后两个维度。可以通过指定perm参数来控制转置操作的细节,以满足特定的需求

5.tf.tile(x, multiples, name=None)(复制维度)

# 定义一个形状为(2, 3)的张量
tensor = tf.constant([[1, 2, 3], [4, 5, 6]])
print(tensor)
# 复制张量的内容
tiled = tf.tile(tensor, multiples=[2, 1])
print(tiled)

  

在上述例子中,我们定义了一个形状为(2, 3)的张量。然后,使用tf.tile函数对张量进行复制操作。通过设置multiples=[2, 1],我们将第一个维度复制了2次,第二个维度复制了1次。tf.tile函数在机器学习任务中经常用于数据增强,或者在某些操作中需要扩展张量的维度以匹配另一个张量的形状要求。

九.Broadcasting

        Broadcasting,它是一种轻量 级的张量复制手段,在不增加存储空间的情况下,自动将一些较小的张量复制成较大张量的机制,以便进行元素级操作。

        Broadcasting的原则如下:

  1. 如果两个数组的维度数不同,将维度较低的数组的形状在最左边补1,直到形状匹配。
  2. 如果两个数组的形状在某个维度上不匹配,并且其中一个数组的大小为1,则该维度的大小将被扩展以匹配较大数组的大小。
  3. 如果在任何维度上的大小都不匹配,也没有一个维度的大小等于1,则会引发错误。

        通过Broadcasting,我们可以在不复制数组数据的情况下进行元素级别的操作,这可以提高计算效率并减少内存消耗。

        我们可以 利用tf.broadcast_to(input, shape)操作将张量沿着指定的维度进行广播,input 是要广播的张量,shape 是广播后张量的形状。返回一个新的张量,其形状与 shape 相同,值等于将 input 沿着各维进行广播后所得到的张量。

        广播操作必须满足以下两个条件:

  1. 对于每个维度,其长度要么相同,要么其中一个为 1。
  2. 要将某个维度进行广播,需要满足其长度为 1。
#定义两个张量
x = tf.constant([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
y = tf.constant([[1, 1, 1, 1]])
print(y)
#通过广播将其扩展并将其与 x 相加
z = tf.broadcast_to(y, [3, 4])
print(z)
result = x + z
print(result)

  

y 的形状为 shape(1,4),我们通过广播将其扩展到了shape (3,4),并将其与 x 相加,得到了一个形状为 shape(3, 4) 的新张量 result

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值