文章目录
- 1. 张量
- 2. 自动求导、梯度下降
学习于:简单粗暴 TensorFlow 2
1. 张量
代码语言:javascript复制import tensorflow as tf
print(tf.__version__) # 2.3.1
random_float = tf.random.uniform(shape=())
# tf.Tensor(0.80420315, shape=(), dtype=float32)
zero_vec = tf.zeros(shape=(2))
# tf.Tensor([0. 0.], shape=(2,), dtype=float32)
A = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
B = tf.constant([[5, 6.], [7, 8]])
print(A.shape) # (2, 2) 形状
print(A.dtype) # <dtype: 'float32'> 数据类型
print(A.numpy()) # 取出张量的数值矩阵
# [[1. 2.]
# [3. 4.]]
2. 自动求导、梯度下降
tf.GradientTape()
求导记录器tf.Variable()
变量的操作可被求导记录器记录,常用于机器学习的 参数tape.gradient(loss, vars)
自动计算梯度, loss 对 vars 的梯度optimizer.apply_gradients(grads_and_vars)
优化器更新参数
import numpy as np
# 原始数据
X_raw = np.array([2013, 2014, 2015, 2016, 2017], dtype=np.float32)
y_raw = np.array([12000, 14000, 15000, 16500, 17500], dtype=np.float32)
# 归一化
X = (X_raw - X_raw.min()) / (X_raw.max() - X_raw.min())
y = (y_raw - y_raw.min()) / (y_raw.max() - y_raw.min())
# 转成张量
X = tf.constant(X)
y = tf.constant(y)
# 参数变量
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a, b]
# 梯度下降
num_epoch = 10000 # 迭代轮数
# 优化器
optimizer = tf.keras.optimizers.SGD(learning_rate=5e-4)
# 迭代
for e in range(num_epoch):
# 使用tf.GradientTape()记录损失函数的梯度信息
with tf.GradientTape() as tape:
# 进入 with 上下文后,变量所有的操作被tape记录下来
y_pred = a * X b # 预测值
loss = tf.reduce_sum(tf.square(y_pred - y)) # 平方损失
# 损失函数关于 模型参数 的梯度
grads = tape.gradient(loss, variables)
# 根据梯度 更新参数
optimizer.apply_gradients(grads_and_vars=zip(grads, variables))
代码语言:javascript复制最终变量值:
a <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.97637>
b <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.057565063>