tensorflow自定义整个训练过程

创建一个机器学习的问题

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

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

在这里插入图片描述

自定义我们需要的模型

我们继承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))
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值