f ( x ) = 3 x + 7 f(x) = 3x + 7 f(x)=3x+7
对于一个机器学习问题,有下面的步骤:
监督学习使用输入(通常表示为 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))
我们使用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))