Keras 线性回归

1. 实现线性回归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"""
导包
"""
import matplotlib.pyplot as plt
import numpy as np
# Dense 是全连接层
from keras.layers import Dense
# Sequential 模型是多个网络层的线性堆叠
from keras.models import Sequential

"""
生成数据
"""
# 随机生成100个数
x_data = np.random.rand(100)
# 正态生成100个噪音,第1个参数是均值,第2个参数是方差,第3个参数是形状
noise = np.random.normal(0, 0.01, x_data.shape)
# 生成 y = 0.1x + 0.2 + 噪音抖动
y_data = 0.1 * x_data + 0.2 + noise


"""
构建顺序模型(定义网络)
"""

model = Sequential()
# 在模型中添加全连接层(FC层) units=输出值维度,input_dim=输入值维度。因为x和y都是1维的,所以设置为1
model.add(Dense(units=1, input_dim=1))
# 编译模型,optimizer指定优化器,sgd代表随机梯度下降;loss指定损失函数,"mse"代表均方误差
model.compile(optimizer='sgd', loss='mse')

"""
训练
"""
for step in range(30000):
# train_on_batch指定要训练的批次数据集,因为我们的数据很小,所以整个数据作为一个批次传入
cost = model.train_on_batch(x_data, y_data)
# 每训练500,输出cost
if step % 500 == 0:
print('step = %s, cost: %s' % (step, cost))

"""
获取训练得到的权值和偏置
"""
# 获取权值和偏置。因为只有1层,所以取layers[0]即可
w, b = model.layers[0].get_weights()
print('w = %s, b = %s' % (w, b))


"""
预测
"""
y_predict = model.predict(x_data)

"""
绘图
"""
# 显示原数据随机点,以散点图形式显示
plt.scatter(x_data, y_data)
# 显示预测结果,画一条直线。颜色'r'即red,lw=3代表线宽为3像素
plt.plot(x_data, y_predict, 'r', lw=3)
plt.show()

2. 实现非线性回归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
"""
导包
"""
import matplotlib.pyplot as plt
import numpy as np
from keras.layers import Dense, Activation
from keras.models import Sequential
from keras.optimizers import SGD

"""
生成数据
"""
# 在[-0.5,0.5]之间生成200个均匀分布的点
x_data = np.linspace(-0.5, 0.5, 200)
# 正态生成噪音点,第1个参数是均值,第2个参数是方差,第3个参数是形状
noise = np.random.normal(0, 0.02, x_data.shape)
# 生成 y = x^2 + 噪音
y_data = x_data ** 2 + noise

"""
构建顺序模型(定义网络)
1 - 10 - 1
"""

model = Sequential()
# 添加 1 --> 10
model.add(Dense(input_dim=1, units=10))
model.add(Activation('tanh')) # 添加非线性激活函数
# 添加 10 --> 1,"input_dim=10"可以省略,keras可以推断上一层的输出维度
model.add(Dense(input_dim=10, units=1))
model.add(Activation('tanh')) # 添加非线性激活函数
# 自定义优化器SGD,lr(learning rate)设置学习率,默认0.01
sgd = SGD(lr=0.3)
# 编译模型
model.compile(optimizer=sgd, loss='mse')

"""
训练
"""
for step in range(30000):
# train_on_batch指定要训练的批次数据集,因为我们的数据很小,所以整个数据作为一个批次传入
cost = model.train_on_batch(x_data, y_data)
# 每训练500,输出cost
if step % 500 == 0:
print('step = %s, cost: %s' % (step, cost))

"""
预测
"""
y_predict = model.predict(x_data)

"""
绘图
"""
plt.scatter(x_data, y_data)
plt.plot(x_data, y_predict, 'r', lw=3)
plt.show()

2.1. 添加激活函数的两种方式

方式1:

1
2
3
4
model.add(Dense(input_dim=1, units=10))
model.add(Activation('tanh'))
model.add(Dense(input_dim=10, units=1))
model.add(Activation('tanh'))

方式1:

1
2
model.add(Dense(input_dim=1, units=10, activation='tanh'))
model.add(Dense(input_dim=10, units=1, activation='tanh'))

panchaoxin wechat
关注我的公众号
支持一下