当前位置:网站首页>tensorflow2的GradientTape求梯度

tensorflow2的GradientTape求梯度

2022-06-23 11:09:00 河北一帆

上一篇博文使用tensorflow2创建神经网络_河北一帆的博客-CSDN博客中创建的神经网络,使用optimizer的minimize方法进行损失函数优化,其原理是对每层的权重和偏置求梯度,进行梯度下降更新。

tensorflow2中提供了GradientTape方式能够非常方便的实现求梯度,通过求梯度,自己实现minimize方法。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt


class NN:
    def __init__(self):
        # 创建一个隐藏层的神经网络模型
        self.model = tf.keras.Sequential()
        self.model.add(tf.keras.layers.Dense(10, activation='relu'))
        self.model.add(tf.keras.layers.Dense(1, activation='relu'))
        self.model.build((None, 2))     # 2表示 input是2维

    def output(self, x):
        return self.model(x)

    def train(self, x, y):
        with tf.GradientTape(watch_accessed_variables=False) as tape:
            tape.watch(self.model.trainable_variables)
            loss = tf.reduce_mean(tf.square(y - self.output(x)))    # 均方误差损失函数

        gradients = tape.gradient(loss, self.model.trainable_variables)
        optimizer = tf.keras.optimizers.Adam()
        optimizer.apply_gradients(zip(gradients, self.model.trainable_weights))
        print(loss)


if __name__ == "__main__":
    nn = NN()
    # 训练集
    x = np.float32(np.random.uniform(0, 10, size=(100, 1)))
    y = np.float32(np.random.uniform(0, 10, size=(100, 1)))
    z = 3 * x + y
    xx = np.hstack((x, y))
    for i in range(1000):
        nn.train(xx, z)

    # 测试集
    x_verify = np.float32(np.random.uniform(0, 10, size=(100, 1)))
    y_verify = np.float32(np.random.uniform(0, 10, size=(100, 1)))
    z_verify = 3 * x_verify + y_verify
    xx_verify = np.hstack((x_verify, y_verify))
    z_ = nn.output(xx_verify).numpy()   # Tensor张量转成numpy array

    plt.plot(z_verify)
    plt.plot(z_)
    plt.show()
self.model.trainable_variables是两层网络的权重和偏置,[w1, b1, w2, b2] = self.model.trainable_variables可以打断点观察。
gradients = tape.gradient(loss, self.model.trainable_variables)即对网络权重和偏置求偏导

网络权重更新时w1\leftarrow w1+\alpha \frac{\partial loss}{\partial w1}

公式中的alpha,可以使用Adam优化算法变步长计算,以下两行实现的就是该功能

optimizer = tf.keras.optimizers.Adam()
optimizer.apply_gradients(zip(gradients, self.model.trainable_weights))

也可使用SGD方法固定Learning rate即\alpha的值

原网站

版权声明
本文为[河北一帆]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_41816368/article/details/125333900