TensorFlow基础
import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.layers as layers
数据类型
数值类型
标量在 TensorFlow 是如何创建的
python 语言方式创建标量
a = 1.2
TF 方式创建标量
aa = tf.constant(1.2)
type(a), type(aa), tf.is_tensor(aa)
如果要使用 TensorFlow 提供的功能函数, 须通过 TensorFlow 规定的方式去创建张量,而不能使用 Python 语言的标准变量创建方式。
x = tf.constant([1,2.,3.3])
打印 TF 张量的相关信息
x
将 TF 张量的数据导出为 numpy 数组格式
x.numpy()
与标量不同,向量的定义须通过 List 容器传给 tf.constant()函数。
创建一个元素的向量:
创建一个元素的向量
a = tf.constant([1.2]) a, a.shape
创建 3 个元素的向量:
创建 3 个元素的向量
a = tf.constant([1,2, 3.]) a, a.shape
定义矩阵
创建 2 行 2 列的矩阵
a = tf.constant([[1,2],[3,4]]) a, a.shape
三维张量可以定义为:
创建 3 维张量
tf.constant([[[1,2],[3,4]],[[5,6],[7,8]]])
通过传入字符串对象即可创建字符串类型的张量
创建字符串
a = tf.constant('Hello, Deep Learning.') a
字符串类型
通过传入字符串对象即可创建字符串类型的张量
创建字符串
a = tf.constant('Hello, Deep Learning.') a
在 tf.strings 模块中,提供了常见的字符串类型的工具函数,如小写化 lower()、 拼接 join()、 长度 length()、 切分 split()等。
小写化字符串
tf.strings.lower(a)
布尔类型
布尔类型的张量只需要传入 Python 语言的布尔类型数据,转换成 TensorFlow 内部布尔型即可。
创建布尔类型标量
tf.constant(True)
创建布尔类型的向量
创建布尔类型向量
tf.constant([True, False])
需要注意的是, TensorFlow 的布尔类型和 Python 语言的布尔类型并不等价,不能通用
创建 TF 布尔张量
a = tf.constant(True)
TF 布尔类型张量与 python 布尔类型比较
print(a is True)
仅数值比较
print(a == True)
数值精度
在创建张量时,可以指定张量的保存精度
创建指定精度的张量
tf.constant(123456789, dtype=tf.int16)
tf.constant(123456789, dtype=tf.int32)
对于浮点数, 高精度的张量可以表示更精准的数据,例如采用 tf.float32 精度保存π时,实际保存的数据为 3.1415927
import numpy as np
从 numpy 中导入 pi 常量
np.pi
32 位
tf.constant(np.pi, dtype=tf.float32)
如果采用 tf.float64 精度保存π,则能获得更高的精度
tf.constant(np.pi, dtype=tf.float64) # 64 位
读取精度
通过访问张量的 dtype 成员属性可以判断张量的保存精度
a = tf.constant(np.pi, dtype=tf.float16)
读取原有张量的数值精度
print('before:',a.dtype)
如果精度不符合要求,则进行转换
if a.dtype != tf.float32:
# tf.cast 函数可以完成精度转换
a = tf.cast(a,tf.float32)
打印转换后的精度
print('after :',a.dtype)
类型转换
系统的每个模块使用的数据类型、 数值精度可能各不相同, 对于不符合要求的张量的类型及精度, 需要通过 tf.cast 函数进行转换
创建 tf.float16 低精度张量
a = tf.constant(np.pi, dtype=tf.float16)
转换为高精度张量
tf.cast(a, tf.double)
进行类型转换时,需要保证转换操作的合法性, 例如将高精度的张量转换为低精度的张量时,可能发生数据溢出隐患:
a = tf.constant(123456789, dtype=tf.int32)
转换为低精度整型
tf.cast(a, tf.int16)
布尔类型与整型之间相互转换也是合法的, 是比较常见的操作
a = tf.constant([True, False])
布尔类型转整型
tf.cast(a, tf.int32)
一般默认 0 表示 False, 1 表示 True,在 TensorFlow 中,将非 0 数字都视为 True,
a = tf.constant([-1, 0, 1, 2])
整型转布尔类型
tf.cast(a, tf.bool)
待优化张量
TensorFlow 增加了一种专门的数据类型来支持梯度信息的记录: tf.Variable。 tf.Variable 类型在普通的张量类型基础上添加了 name, trainable 等属性来支持计算图的构建。
创建 TF 张量
a = tf.constant([-1, 0, 1, 2])
转换为 Variable 类型
aa = tf.Variable(a)
Variable 类型张量的属性
aa.name, aa.trainable
name 属性用于命名计算图中的变量,这套命名体系是 TensorFlow 内部维护的, 一般不需要用户关注 name 属性;
trainable属性表征当前张量是否需要被优化,创建 Variable 对象时是默认启用优化标志,可以设置trainable=False 来设置张量不需要优化。
直接创建 Variable 张量
tf.Variable([[1,2],[3,4]])
创建张量
从数组、列表对象创建
通过 tf.convert_to_tensor 函数可以创建新 Tensor,并将保存在 Python List 对象或者Numpy Array 对象中的数据导入到新 Tensor 中。
从列表创建张量
tf.convert_to_tensor([1,2.])
从数组中创建张量
tf.convert_to_tensor(np.array([[1,2.],[3,4]]))
创建全0或全1张量
创建全 0,全 1 的标量
tf.zeros([]),tf.ones([])
创建全 0,全 1 的向量
tf.zeros([1]),tf.ones([1])
创建全 0 的矩阵
创建全 0 矩阵,指定 shape 为 2 行 2 列
tf.zeros([2,2])
创建全 1 的矩阵
创建全 1 矩阵,指定 shape 为 3 行 2 列
tf.ones([3,2])
通过 tf.zeros_like, tf.ones_like 可以方便地新建与某个张量 shape 一致, 且内容为全 0 或全 1 的张量。
创建一个矩阵
a = tf.ones([2,3])
创建一个与 a 形状相同,但是全 0 的新矩阵
tf.zeros_like(a)
创建与张量A形状一样的全 1 张量
创建一个矩阵
a = tf.zeros([3,2])
创建一个与 a 形状相同,但是全 1 的新矩阵
tf.ones_like(a)
创建自定义数值张量
通过 tf.fill(shape, value)可以创建全为自定义数值 value 的张量,形状由 shape 参数指定。
创建-1 的标量
tf.fill([], -1)
创建-1 的向量
tf.fill([1], -1)
创建 2 行 2 列,元素全为 99 的矩阵
tf.fill([2,2], 99)
创建已知分布的张量
通过 tf.random.normal(shape, mean=0.0, stddev=1.0)可以创建形状为 shape,均值为mean,标准差为 stddev 的正态分布(mean,stddev2)N(mean,stddev2)。
创建标准正态分布的张量
tf.random.normal([2,2])
创建均值为 1,标准差为 2 的正态分布的张量
tf.random.normal([2,2], mean=1,stddev=2)
通过 tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32)可以创建采样自[minval, maxval)区间的均匀分布的张量
创建采样自[0,1)均匀分布的矩阵
tf.random.uniform([3,2])
创建采样自[0,10)均匀分布的矩阵
tf.random.uniform([2,2],maxval=10)
如果需要均匀采样整形类型的数据,必须指定采样区间的最大值 maxval 参数,同时指定数据类型为 tf.int*型
创建采样自[0,100)均匀分布的整型矩阵
tf.random.uniform([2,2],maxval=100,dtype=tf.int32)
创建序列
tf.range(limit, delta=1)可以创建[0, limit)之间,步长为 delta 的整型序列,不包含 limit 本身。
0~10,不包含 10
tf.range(10)
创建 0~10,步长为 2 的整形序列
tf.range(10,delta=2)
tf.range(1,10,delta=2) # 1~10
张量的典型应用
标量
随机模拟网络输出
out = tf.random.uniform([4,10])
随机构造样本真实标签
y = tf.constant([2,3,2,0])
one-hot 编码
y = tf.one_hot(y, depth=10)
计算每个样本的 MSE
loss = tf.keras.losses.mse(y, out)
平均 MSE,loss 应是标量
loss = tf.reduce_mean(loss) print(loss)
向量
考虑 2 个输出节点的网络层, 我们创建长度为 2 的偏置向量b,并累加在每个输出节点上:
z=wx,模拟获得激活函数的输入 z
z = tf.random.normal([4,2])
创建偏置向量
b = tf.zeros([2])
累加上偏置向量
z = z + b z
创建输入节点数为 4,输出节点数为 3 的线性层网络,那么它的偏置向量 b 的长度应为 3
创建一层 Wx+b,输出节点为 3
fc = tf.keras.layers.Dense(3)
通过 build 函数创建 W,b 张量,输入节点为 4
fc.build(input_shape=(2,4))
查看偏置向量
fc.bias
矩阵
2 个样本,特征长度为 4 的张量
x = tf.random.normal([2,4])
定义 W 张量
w = tf.ones([4,3])
定义 b 张量
b = tf.zeros([3])
X@W+b 运算
o = x@w+b o
定义全连接层的输出节点为 3
fc = tf.keras.layers.Dense(3)
定义全连接层的输入节点为 4
fc.build(input_shape=(2,4))
查看权值矩阵 W
fc.kernel
三维张量
自动加载 IMDB 电影评价数据集
(x_train,y_train),(x_test,y_test)=keras.datasets.imdb.load_data(num_words=10000)
将句子填充、截断为等长 80 个单词的句子
x_train = keras.preprocessing.sequence.pad_sequences(x_train,maxlen=80) x_train.shape
可以看到 x_train 张量的 shape 为[25000,80],其中 25000 表示句子个数, 80 表示每个句子共 80 个单词,每个单词使用数字编码方式表示。
我们通过 layers.Embedding 层将数字编码的单词转换为长度为 100 个词向量:
创建词向量 Embedding 层类
embedding = tf.keras.layers.Embedding(10000, 100)
将数字编码的单词转换为词向量
out = embedding(x_train) out.shape
可以看到,经过 Embedding 层编码后,句子张量的 shape 变为[25000,80,100],其中 100 表示每个单词编码为长度是 100 的向量。
四维张量
创建 32x32 的彩色图片输入,个数为 4
x = tf.random.normal([4,32,32,3])
创建卷积神经网络
layer = layers.Conv2D(16, kernel_size=3)
前向计算
out = layer(x)
输出大小
out.shape
访问卷积核张量
layer.kernel.shape