tensorflow自定义整个训练过程

创建一个机器学习的问题

f ( x ) = 3 x + 7 f(x) = 3x + 7 f (x )=3 x +7
对于机器学习问题,有以下步骤:

[En]

For a machine learning problem, there are the following steps:

  1. 获得训练数据。
  2. 定义模型。
  3. 定义损失函数。
  4. 遍历训练数据,从目标值计算损失。
  5. 计算该损失的梯度,并使用optimizer调整变量以适合数据。
  6. 计算结果。

建立数据

监督学习使用输入(通常表示为 x)和输出(表示为 y,通常称为标签)。目标是从成对的输入和输出中学习,以便您可以根据输入预测输出的值。TensorFlow中几乎每个输入数据都是由张量表示,并且通常是向量。监督学习中,输出(即想到预测值)同样是个张量。这是通过将高斯(即正态分布)噪声添加到直线上的点而合成的一些数据,并对这些数据进行可视化。

x = np.random.random([1000]) * 5
noise = np.random.random([1000])
y = 3 * x + 7
import matplotlib.pyplot as plt
plt.scatter(x, y, c="b")
plt.show()

tensorflow自定义整个训练过程

自定义我们需要的模型

我们继承tf.module类,并且定义两个变量,其属性是trainable_variables。

class selfmodel(tf.Module):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.v1 = tf.Variable(1.0, trainable=True)
        self.v2 = tf.Variable(2.0, trainable=True)
    def __call__(self, x):
        y = self.v1 * x  + self.v2
        return y

定义损失函数

我们在这里使用均方差来计算损失。

[En]

What we use here is mean square deviation to calculate the loss.

def loss(target_y, predicted_y):
    return tf.reduce_mean(tf.square(target_y - predicted_y))

定义循环training函数

我们使用epcohs函数来训练得到我们所需的两个变量v 1 , v 2 v1,v2 v 1 ,v 2,之后对每次训练之后的v 1 , v 2 v1, v2 v 1 ,v 2记录,最后进行可视化

def train(model, x, y,epochs,optimizer):
    v1, v2 = [], []
    for j in range(epochs):
        with tf.GradientTape() as gd:
            y_pred = model(x)  #这个需要在里面
            loss_score = loss(y, y_pred)
        grad = gd.gradient(loss_score, model.trainable_variables)
        optimizer.apply_gradients(zip(grad, model.trainable_variables))
        v1.append(model.v1.numpy())
        v2.append(model.v2.numpy())
    return (model, v1, v2)

最终结果展示

我在定义epcohs的时候,如果设置的太小,则会导致v 1 , v 2 v1,v2 v 1 ,v 2不能够得到正确的结果

opt = tf.keras.optimizers.SGD()
model = selfmodel()
epochs = 1000
(model, v1, v2) = train(model, x, y,epochs, opt)
绘制
plt.plot(range(epochs), v1, "r",
         range(epochs), v2, "b")
plt.plot([3] * epochs, "r--",
         [7] * epochs, "b--")
plt.legend(["W", "b", "True W", "True b"])
plt.show()

tensorflow自定义整个训练过程

代码中出现的问题

#这种情况的代码会报错,说我们的grad结果为(none, none),
#因为y_pred = model(x)应该写在with里面
#下面会写出正确的写法,这种错误出现的原因就是loss函数在
#对molel.trainable_variables求导时,找不到梯度
y_pred = model(x)
with tf.GradientTape() as t:
    l = loss(y, y_pred)
grad = t.gradient(l, model.trainable_variables)
optimizer = tf.keras.optimizers.SGD()
optimizer.apply_gradients(zip(grad, model.trainable_variables))

#正确的写法
with tf.GradientTape() as t:
    y_pred = model(x)
    l = loss(y, model(x))
grad = t.gradient(l, model.trainable_variables)
print(model.trainable_variables)
optimizer = tf.keras.optimizers.SGD()
optimizer.apply_gradients(zip(grad, model.trainable_variables))

Original: https://blog.csdn.net/weixin_45931455/article/details/122914058
Author: @zhou
Title: tensorflow自定义整个训练过程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/509366/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球