tensorflow - 使用 tensorflow 2.0 执行线性回归
问题描述
如何在 Tensorflow 2.0 中执行线性回归?示例或教程链接将不胜感激。YouTube 上的所有教程都使用 tensorflow 1
解决方案
示例 1:使用Tensorflow 2.0.0进行回归:
import tensorflow as tf
# tensorflow 2.0.0
class Model:
def __init__(self):
self.W = tf.Variable(7.0) # initial value for model parameter W
self.b = tf.Variable(0.0) #initial value for model bias b
def model(self, x):
return self.W * x + self.b
def loss(predicted_label, target_label):
return tf.reduce_mean(tf.square(predicted_label - target_label))
def train(self,inputs, outputs, learning_rate):
with tf.GradientTape() as t:
current_loss = Model.loss(self.model(inputs), outputs)
#backpropagation
dW, db = t.gradient(current_loss, [self.W, self.b])
self.W.assign_sub(learning_rate * dW)
self.b.assign_sub(learning_rate * db)
return current_loss
def run(self):
import matplotlib.pyplot as plt
# Generate train data when true W=2.0 and b=3.0
TRUE_W = 2.0
TRUE_b = 3.0
NUM_INSTANCES = 500 # number of tarin data
inputs = tf.random.normal(shape=[NUM_INSTANCES])
noise = tf.random.normal(shape=[NUM_INSTANCES])
outputs = inputs * TRUE_W + TRUE_b + noise
print("Model before train (red dots):")
plt.scatter(inputs, outputs, c='b')
plt.scatter(inputs, self.model(inputs), c='r')
plt.show()
epochs = range(50)
for epoch in epochs:
current_loss=self.train(inputs, outputs, learning_rate=0.1)
if epoch%10==0:
print('Epoch %2d: loss=%2.5f' %
(epoch, current_loss))
print("Model after train (red dots):")
plt.scatter(inputs, outputs, c='b')
plt.scatter(inputs, self.model(inputs), c='r')
plt.show()
ob=Model()
ob.run()
示例 2:使用Tensorflow 2.0.0和keras 优化器进行回归:
import tensorflow as tf
#Tensorflow 2.0.0
class Model:
def __init__(self):
self.W = tf.Variable(5.0)
self.b = tf.Variable(0.0)
def model(self):
return self.W * self.inputs + self.b
def loss(self):
return tf.reduce_mean(tf.square(self.model() - self.outputs))
def run(self):
import matplotlib.pyplot as plt
# Generate train data when true W=4.0 and b=1.0
TRUE_W = 2.0
TRUE_b = 3.0
NUM_INSTANCES = 500 # number of tarin data
print("Model befor train (red dots):")
self.inputs = tf.random.normal(shape=[NUM_INSTANCES])
noise = tf.random.normal(shape=[NUM_INSTANCES])
self.outputs = self.inputs * TRUE_W + TRUE_b + noise
plt.scatter(self.inputs, self.outputs, c='b')
plt.scatter(self.inputs, self.model(), c='r')
plt.show()
opt = tf.keras.optimizers.Adam(learning_rate=0.1)
epochs = range(50)
for epoch in epochs:
opt.minimize(self.loss, var_list=[self.W,self.b])
current_loss=self.loss()
if epoch%10==0:
print('Epoch %2d: loss=%2.5f' %
(epoch, current_loss))
print("Model after train (red dots):")
plt.scatter(self.inputs, self.outputs, c='b')
plt.scatter(self.inputs, self.model(), c='r')
plt.show()
ob=Model()
ob.run()
希望这可以帮助。