3.2 Tensorflow基础运算

本文介绍了TensorFlow的基础知识,包括导入库、矩阵运算、张量属性和操作。通过示例展示了如何使用tf.constant创建张量、tf.matmul进行矩阵乘法以及tf.add进行加法。此外,还探讨了TensorFlow的自动求导机制,利用tf.GradientTape计算导数,并给出了变量的使用示例。最后,展示了如何在机器学习场景中应用自动求导来计算梯度。
摘要由CSDN通过智能技术生成

3.2 Tensorflow基础运算

1. 导入Tensorflow

import tensorflow as tf

2. 矩阵计算

TensorFlow是一个科学计算库,它使用 张量 (Tensor)作为数据的基本单位。

TensorFlow的张量在概念上等同于多维数组,我们可以使用它来描述数学中的标量(0 维数组)、向量(1 维数组)、矩阵(2 维数组)等各种量,示例如下:
A = [ a 1 , 1 a 1 , 2 a 2 , 1 a 2 , 2 ] B = [ b 1 , 1 b 1 , 2 b 2 , 1 b 2 , 2 ] C = A B = [ a 1 , 1 ∗ b 1 , 1 + a 1 , 2 ∗ b 2 , 1 a 1 , 1 ∗ b 1 , 2 + a 1 , 2 ∗ b 2 , 2 a 2 , 1 ∗ b 1 , 1 + a 2 , 2 ∗ b 2 , 1 a 2 , 1 ∗ b 1 , 2 + a 2 , 2 ∗ b 2 , 2 ] A = \begin{bmatrix} a_{1,1} & a_{1,2} \\ a_{2,1} & a_{2,2} \end{bmatrix} B = \begin{bmatrix} b_{1,1} & b_{1,2} \\ b_{2,1} & b_{2,2} \end{bmatrix}\\[2ex] C = AB = \begin{bmatrix} a_{1,1}*b_{1,1} + a_{1,2}*b_{2,1} & a_{1,1}*b_{1,2} + a_{1,2}*b_{2,2}\\a_{2,1}*b_{1,1} + a_{2,2}*b_{2,1} & a_{2,1}*b_{1,2} + a_{2,2}*b_{2,2} \end{bmatrix} A=[a1,1a2,1a1,2a2,2]B=[b1,1b2,1b1,2b2,2]C=AB=[a1,1b1,1+a1,2b2,1a2,1b1,1+a2,2b2,1a1,1b1,2+a1,2b2,2a2,1b1,2+a2,2b2,2]

tf.constant: 创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list

tf.matmul: 将矩阵 a a a乘以矩阵 b b b,生成 a ∗ b a * b ab

A = tf.constant([[1, 2], [3, 4]])
B = tf.constant([[5, 6], [7, 8]])
C = tf.matmul(A, B)
print(C)

输出内容如下:

tf.Tensor(
[[19 22]
 [43 50]], shape=(2, 2), dtype=int32)

输出成功,证明Tensorflow安装成功。


再例如:

# 定义一个随机数(标量)
random_float = tf.random.uniform(shape=())

# 定义一个有两个元素的零向量
zero_vector = tf.zeros(shape=(2))

# 定义两个2*2的常量矩阵
A = tf.constant([[1, 2], [3, 4]])
B = tf.constant([[5, 6], [7, 8]])

张量的重要属性是它的形状、类型和值。我们可以通过张量的shapedtype属性和numpy()方法获得。例如:

# 查看矩阵A的形状、类型和值
# 输出(2, 2),即矩阵的长和宽均为2
print(A.shape) 

# 输出<dtype: 'float32'>
print(A.dtype)  

# 输出[[1, 2], [3, 4]]
print(A.numpy())  

输出内容如下:

(2, 2)
<dtype: 'int32'>
[[1 2]
 [3 4]]

TensorFlow 中有大量的操作(Operation),可以让我们将已有的张量进行运算后得到新的张量。示例如下:

#计算矩阵A和B的和
C = tf.add(A, B)

#计算矩阵A和B的乘积
D = tf.matmul(A, B)

#输出
print(C)
print(D)

输出内容如下:

tf.Tensor(
[[ 6  8]
 [10 12]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[19 22]
 [43 50]], shape=(2, 2), dtype=int32)

3. 自动求导机制

在机器学习中,我们经常需要计算函数的导数。TensorFlow 提供了强大的自动求导机制来计算导数。

在时执行模式下,TensorFlow 引入了tf.GradientTape()这个 “求导记录器” 来实现自动求导。

以下代码展示了如何使用tf.GradientTape() 计算函数 y ( x ) = x 2 y(x) = x^2 y(x)=x2 x = 3 x = 3 x=3 时的导数:

x = tf.Variable(initial_value = 3.) #x在3出
with tf.GradientTape() as tape:   # 在tf.GradientTape()的上下文内,所有计算步骤都会被记录以用于求导
    y = tf.square(x)
y_grad = tape.gradient(y, x)     #计算y关于x的导数
print(y, y_grad)

输出内容如下:

tf.Tensor(9.0, shape=(), dtype=float32) tf.Tensor(6.0, shape=(), dtype=float32)

这里 x 是一个初始化为 3 的 变量 (Variable),使用 tf.Variable() 进行声明。

与普通张量一样,变量同样具有形状、类型和值三种属性。

使用变量需要有一个初始化过程,可以通过在 tf.Variable() 中指定 initial_value 参数来指定初始值。这里将变量 x 初始化为 3

变量与普通张量的一个重要区别是它默认能够被 TensorFlow 的自动求导机制所求导,因此往往被用于定义机器学习模型的参数。
tf.GradientTape() 是一个自动求导的记录器。只要进入了 with tf.GradientTape() as tape的上下文环境,程序在这个环境中计算的步骤都会被自动记录。

X = tf.constant([[1., 2.], [3., 4.]])
y = tf.constant([[1.], [2.]])
w = tf.Variable(initial_value = [[1.], [2.]])
b = tf.Variable(initial_value = 1.)
with tf.GradientTape() as tape:
    L = tf.reduce_sum(tf.square(tf.matmul(X, w) + b - y))
w_grad, b_grad = tape.gradient(L, [w, b])
print(L, w_grad, b_grad)

输出内容如下;

tf.Tensor(125.0, shape=(), dtype=float32) tf.Tensor(
[[ 70.]
 [100.]], shape=(2, 1), dtype=float32) tf.Tensor(30.0, shape=(), dtype=float32)

这里, tf.square() 操作代表对输入张量的每一个元素求平方,不改变张量形状

tf.reduce_sum()操作代表对输入张量的所有元素求和,输出一个形状为空的张量

TensorFlow 中有大量的张量操作 API,包括数学运算、张量形状操作(如 tf.reshape())、切片和连接(如 tf.concat())等多种类型

可以通过查阅 TensorFlow 的官方 API 文档来进一步了解

API地址:https://tensorflow.google.cn/versions

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值