TensorFlow 2.0 - 张量/自动求导/梯度下降

2021-02-19 14:45:05 浏览数 (1)

文章目录

    • 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) 优化器更新参数
代码语言:javascript复制
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>

0 人点赞