Tensorflow中所有的运算操作都是基于张量对象进行的
TensorFlow 中的基本数据类型,它包含了数值型、字符串型和布尔型
数值类型:
1、标量(Scalar) 单个的实数,如 1.2, 3.4 等,维度数(Dimension,也叫秩)为 0,shape 为[]
2、向量(Vector) n 个实数的有序集合,通过中括号包裹,维度数为 1,长度不定,shape 为[????]
3、矩阵(Matrix) n 行 m 列实数的有序集合,维度数为 2,每个维度上的长度不定,shape 为[????,????]
4、张量(Tensor) 所有维度数dim > 2的数组统称为张量。

a = tf.constant(1.2) # 创建标量,tensorflow.python.framework.ops.EagerTensor
张量 numpy()方法可以返回 Numpy.array 类型的数据
a.numpy() 的返回值为1.2
与标量不同,向量,矩阵,张量的定义须通过 List 类型传给 tf.constant()。
a = tf.constant([1.2]) # 创建向量
a = tf.constant([[1,2],[3,4]]) # 创建矩阵
a = tf.constant([[[1,2],[3,4]],[[5,6],[7,8]]]) # 创建张量

字符串类型:
a = tf.constant(‘Hello, Deep Learning.’) # 创建字符串类型数据,shape为()
在 tf.strings 模块中,提供了常见的字符串型的工具函数,如拼接 join(),长度 length(),切 分 split()
tf.strings.lower(a) # 将字符串中的字符变成小写

布尔类型:
a = tf.constant(True) # 创建布尔类型数据,也可传入List[True,False]

数值精度
常用的精度类型有 tf.int16, tf.int32, tf.int64, tf.float16, tf.float32, tf.float64,其中 tf.float64 即为 tf.double。
在创建张量时,可以指定张量的保存精度:
tf.constant(123456789, dtype=tf.int16) # 若要进行类型转换,注意溢出问题
读取精度 :
print(‘before:’,a.dtype) # 利用dtype属性查看精度
类型转换 :
通过 tf.cast( ) 函数进行转换
布尔型与整形之间相互转换也是合法的,一般默认 0 表示 False,1 表示 True,在 TensorFlow 中,将非 0 数字都视为 True

待优化张量 :
tensorFlow 增加了 一种专门的数据类型来支持梯度信息的记录:tf.Variable( )
tf.Variable 类型在普通的张量类 型基础上添加了 name,trainable 等属性来支持计算图的构建
name属性用于命名计算图中的变量。trainable 表征当前张量是否需要被优化
创建 Variable 对象是默认启用优化标志,可以设置 trainable=False 来设置张量不需要优化
普通张量也可以通过 GradientTape.watch()方法临 时加入跟踪梯度信息的列表

通过 tf.convert_to_tensor 可以将python LIst或者Numpy Array转换为Tensor
tf.convert_to_tensor(np.array([[1,2.],[3,4]]))
Numpy 中浮点数数组默认使用 64-Bit 精度保存数据,转换到 Tensor 类型时 精度为 tf.float64
tf.zeros([]),tf.ones([]) 创建全0、全1的张量数据

通过 tf.zeros_like, tf.ones_like 可以方便地新建与某个张量 shape 一致,内容全 0 或全 1 的张量
a = tf.ones([2,3])
tf.zeros_like(a)

通过 tf.fill(shape, value)可以创建全为自定义数值 value 的张量。

通过 tf.random.normal(shape, mean=0.0, stddev=1.0)可以创建形状为 shape,均值为 mean,标准差为 stddev 的正态分布????(????????????????,????????????????????????**2)

通过 tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32)可以创建采样自 [????????????????????????,????????????????????????]区间的均匀分布的张量。

tf.range(limit, delta=1)可以创建[0,????????????????????)之间,步长为 delta 的整形序 列,不包含 limit 本身。

通过 tf.range(start, limit, delta=1)可以创建[????????????????????,????????????????????),步长为 delta 的序列,不包含 limit 本身

y = tf.one_hot(y, depth=10) # one-hot 编码
loss = tf.keras.losses.mse(y, out) # 计算每个样本的 MSE
loss = tf.reduce_mean(loss) # 平均 MSE

通过高层接口类 Dense()方式创建的网络层,张量 W 和????存储在类的内部,由类自动创建并管理。可以通过全连接层的 bias 成员变量查看偏置变量????
fc = layers.Dense(3) # 创建一层 Wx+b,输出节点为 3
fc.build(input_shape=(2,4)) # 通过 build 函数创建 W,b 张量,输入节点为 4
fc.bias # 查看偏置b
fc.kernel 成员名查看其权值矩阵 W:

#自动加载 IMDB 电影评价数据集 (x_train,y_train),(x_test,y_test)=keras.datasets.imdb.load_data(num_words=10 000)
#将句子填充、截断为等长 80 个单词的句子 ,每个单词使用数字编码方式。
x_train = keras.preprocessing.sequence.pad_sequences(x_train,maxlen=80)

通过 layers.Embedding 层将数字编码的单词转换为长度为 100 个词向量
#创建词向量 Embedding 层类 embedding=layers.Embedding(10000, 100)
#将数字编码的单词转换为词向量 out = embedding(x_train)
out.shape 为TensorShape([25000, 80, 100])

索引 :
在TensorFlow 中,支持基本的[????][????]…标准索引方式,也支持通过逗号分隔索引号的索引方式。
切片 :
通过????????????????????:????????????:????????????????切片方式可以方便地提取一段数据,其中 start 为开始读取位置的 索引,end 为结束读取位置的索引(不包含 end 位),step 为读取步长。
start????step切片方式有很多简写方式,其中 start、end、step 3 个参数可以根据需要选择性地省略,全部省略时即::,表示从最开始读取到最末尾,步长为 1,即不跳过任何元素。::可以简写为单个冒号:
step 可以为负数,考虑最特殊的一种例子,step = −1时,start????−1表示 从 start 开始,逆序读取至 end 结束(不包含 end),索引号???????????? ≤ ????????????????????
Tensorflow2.0 基础
避免出现像????[:,:,:,1]这样出现过多冒号的情况,可以使用⋯符号表示取多个维度 上所有的数据,其中维度的数量需根据规则自动推断:当切片方式出现⋯符号时,⋯符号 左边的维度将自动对齐到最左边,⋯符号右边的维度将自动对齐到最右边,此时系统再自动推断⋯符号代表的维度数量
Tensorflow2.0 基础

通过 tf.reshape(x, new_shape),可以将张量的视图任意的合法改变
通过 tf.expand_dims(x, axis)可在指定的 axis 轴前可以插入一个新的维度
需要注意的是,tf.expand_dims 的 axis 为正时,表示在当前维度之前插入一个新维度;为负时,表示当前维度之后插入一个新的维度。

删除维度只能删除长度为 1 的维度,通过 tf.squeeze(x, axis)函数,axis 参数为待删除的维度的索引号
如果不指定维度参数 axis,即 tf.squeeze(x),那么他会默认删除所有长度为 1 的维度:

使用tf.transpose(x, perm)函数完成维度交换操作,其中 perm 表示新维度的顺序 List

通过 tf.tile(x, multiples)函数完成数据在指定维度上的复制操作,multiples 分别指定了每个维度上 面的复制倍数,对应位置为 1 表明不复制,为 2 表明新长度为原来的长度的 2 倍,即数据复制一份,以此类推。

Broadcasting:
Broadcasting 也叫广播机制(自动扩展也许更合适),它是一种轻量级张量复制的手段, 在逻辑上扩展张量数据的形状,但是只要在需要时才会执行实际存储复制操作。
对于所有长度为 1 的维度,Broadcasting 的效果和 tf.tile 一样,都能在此维度上逻辑复 制数据若干份,区别在于 tf.tile 会创建一个新的张量,执行复制 IO 操作,并保存复制后的 张量数据,Broadcasting 并不会立即复制数据,它会逻辑上改变张量的形状,使得视图上变 成了复制后的形状。

x = tf.random.normal([2,4])
w = tf.random.normal([4,3])
b = tf.random.normal([3])
y = [email protected]+b # 此处维度不一致依然可以相加
上述加法并没有发生逻辑错误,那么它是怎么实现的呢?这是因为它自动调用 Broadcasting 函数 tf.broadcast_to(x, new_shape),将 2 者 shape 扩张为相同的[2,3],即上式可以等效为:
y = [email protected] + tf.broadcast_to(b,[2,3])
也就是说,操作符+在遇到 shape 不一致的 2 个张量时,会自动考虑将 2 个张量 Broadcasting 到一致的 shape,然后再调用 tf.add 完成张量相加运算
使用Broadcasting机制前,先进行维度补齐,在验证维度的普适性

数学运算:
加减乘除: tf.add, tf.subtract, tf.multiply, tf.divide(可直接使用键盘符号)
通过//和%运算符实现整除和余除
tf.pow(x, a)实现乘方运算,也可使用运算符
tf.pow(a, x)或者
运算符实现指数运算

@运算符可以方便的实现矩阵相乘,还可以通过 tf.matmul(a, b)实现

TensorFlow 中的矩阵相乘可以使用批量方式,也就是张量 a,b 的维度数可以大于 2。当张量 a,b 维度数大于 2 时,TensorFlow 会选择 a,b 的最后两个维度进行矩阵相乘,前面所有的维度都视作Batch维度,前面的Batch维度必须相同。

矩阵相乘函数支持自动 Broadcasting 机制:

相关文章: