TensorFlow 2.0 实现线性回归和非线性回归

1. 线性回归

1.1 导库

import numpy as np
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
import matplotlib.pyplot as plt

1.2 生成数据

  其中np.random.rand是生成[0, 1]的数据。np.random.randn是标准正态分布(均值是0,方差是1)。np.random.normal是生成正态分布数据,第一个参数是均值,第二个参数是方差。

x = np.random.rand(100)
noise = np.random.normal(0, 0.01, size = x.shape)
y = 0.1 * x + 0.2 + noise

plt.scatter(x, y)

TensorFlow 2.0 实现线性回归和非线性回归_第1张图片

1.3 构建模型

  这里的构建模型指的是两步:首先构建模型,然后设置优化器、损失函数和度量标准。其中第一个网络层需要指定输入维度,一般使用input_shape,可通过input_dim进行简写。

model = Sequential()
model.add(Dense(units = 1, input_dim = 1))

model.compile(optimizer = 'sgd', loss = 'mse') #这里如果metrics中添加了mse,在训练模型返回参数的时候就会变成一个list,也就是loss和metrics。

1.4 训练模型

这种写法其实有点小问题,因为每个batch的数据是全部数据了。

for step in range(5000):
    loss = model.train_on_batch(x, y)
    if step % 100 == 0:
        print('loss is', loss)

1.5 模型预测

y_pred = model.predict(x)

plt.scatter(x, y)
plt.plot(x, y_pred)
plt.show()

TensorFlow 2.0 实现线性回归和非线性回归_第2张图片

2. 非线性回归

2.1 导库

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Activation

2.2 生成数据

x = np.linspace(-0.5, 0.5, 201)
y = np.square(x) + np.random.normal(0, 0.01, size = x.shape)
plt.scatter(x, y)

TensorFlow 2.0 实现线性回归和非线性回归_第3张图片

2.3 构建模型

  若干个个问题:

  1. 如果不添加tanh会怎么样?
  2. 如果直接写model.compile(optimizer = ‘sgd’, loss = ‘mse’)会怎么样?
  3. 如果直接换成其他优化器,如AdaGrad或者Adam,结果也会是一条直线嘛?
  4. 如果在Dense之后添加DropOut,会有什么样的效果?
model = Sequential()
model.add(Dense(units=10, input_dim=1))
model.add(Activation('tanh'))
model.add(Dense(units=1))

model.compile(optimizer = tf.keras.optimizers.SGD(lr=0.3), loss = 'mse')

2.4 训练模型

for epoch in range(1000):
    model.fit(x, y, batch_size = 64)

2.5 模型预测

y_pred = model.predict(x)
plt.scatter(x, y)
plt.plot(x, y_pred, color = 'r' )
plt.show()

TensorFlow 2.0 实现线性回归和非线性回归_第4张图片

你可能感兴趣的:(TensorFlow)