TensorFlow基础1

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值