欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

tensorflow自定义整个训练过程

时间:2023-05-26
创建一个机器学习的问题

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

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

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

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

自定义我们需要的模型

我们继承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

定义损失函数

我们这里采用的是均方差来计算损失

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

定义循环training函数

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

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 v1,v2不能够得到正确的结果

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()

代码中出现的问题

#这种情况的代码会报错,说我们的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))

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。