基于keras的线性方程回归模型

0.完整代码

下面一段代码实现了2个功能:
1.用keras库编程实现拟合线性方程的回归模型;
2.对比了4种优化器的性能。
解释每一行代码的作用:
第1行代码从keras.models库中导入Sequential类;
第2行代码从keras.layers库中导入Dense类;
第3行代码从keras库中导入optimizers库;
第4行代码导入numpy库,起别名np;
第6行代码是python中定义主函数的固定格式;
第7行代码定义变量w,即线性方程中的斜率;
第8行代码定义变量b,即线性方程中的纵截距;
第9行代码调用np.linspace方法定义2-100中间的50个点,赋值给变量X;
第10行代码利用ndarray对象的广播性质,对矩阵的每个值乘以w,再加上b;
第11行代码打印变量X中的前5个数;
第12行代码打印变量Y中的前5个数;
第13行代码调用optimizers.Adam类初始化方法,实例化对象赋值给变量adam;
第14行代码调用optimizers.SGD类初始化方法,实例化对象赋值给变量sgd;
第15行代码调用optimizers.Adagrad类初始化方法,实例化对象赋值给变量adagrad;
第16行代码调用optimizers.Adadelta类初始化方法,实例化对象赋值给变量adadelta;
第17行代码将4种优化器整合到列表optimizer_list中;
第18行代码将4种轮次整合到列表epochs_list中,epochs中文叫做轮次;
第19-20行代码是一个2重循环,对4种轮次、4种优化器组合循环。
第21行代码调用Sequential类初始化方法,实例化对象赋值给变量model;
第22行代码调用变量model的add方法,添加全连接层,全连接层输入input_dim为1,输出units为1;
第23行代码调用变量model的compile方法,方法需要2个参数,第1个关键字参数loss的数据类型为字符串,第2个关键字参数optimizer的数据类型为优化器对象;
第24行代码调用变量model的fit方法,开启模型训练,fit方法需要5个参数,第1个参数是特征矩阵X,第2个参数是预测目标值Y,第3个关键字参数steps_per_epoch是每轮训练步数,第4个关键字参数epochs是训练轮次,第5个关键字参数verbose为是否打印训练过程的信息;
第25行代码获取已经训练好模型的w值,赋值给变量trained_w;
第26行代码获取已经训练好模型的b值,赋值给变量trained_b;
第27行代码调用绝对值方法abs,计算w值误差,赋值给变量w_error;
第28行代码调用绝对值方法abs,计算b值误差,赋值给变量b_error;
第29-30行代码打印提示信息。

from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
import numpy as np

if __name__ == '__main__':
    w = 2.5
    b = 1.5
    X = np.linspace(2, 100, 50)
    Y = X * w + b
    print('X[:5]:', X[:5])
    print('Y[:5]:', Y[:5])
    adam = optimizers.Adam(lr=0.02)
    sgd = optimizers.SGD(lr=0.0002)
    adagrad = optimizers.Adagrad(lr=0.3)
    adadelta = optimizers.Adadelta(lr=0.3)
    optimizer_list = [adam, sgd, adagrad, adadelta]
    epochs_list = [100, 200, 500, 1000]
    for epochs in epochs_list:
        for optimizer in optimizer_list:
            model = Sequential()
            model.add(Dense(input_dim=1, units=1))
            model.compile(loss='mse', optimizer=optimizer)
            model.fit(X, Y, steps_per_epoch=10, epochs=epochs, verbose=False)
            trained_w = model.layers[0].get_weights()[0][0][0]
            trained_b = model.layers[0].get_weights()[1][0]
            w_error = abs(trained_w - w)
            b_error = abs(trained_b - b)
            print('epochs:%d, 优化器种类:%s,\t w误差:%.4f, b误差:%.4f'
                  %(epochs, optimizer.__class__, w_error, b_error))

上面一段代码的运行结果如下:

X[:5]: [ 2. 4. 6. 8. 10.]
Y[:5]: [ 6.5 11.5 16.5 21.5 26.5]
epochs:100, 优化器种类:, w误差:0.0083, b误差:0.5539
epochs:100, 优化器种类:, w误差:0.0195, b误差:1.3155
epochs:100, 优化器种类:, w误差:0.0297, b误差:1.9919
epochs:100, 优化器种类:, w误差:0.4450, b误差:0.9875
epochs:200, 优化器种类:, w误差:0.0032, b误差:0.2133
epochs:200, 优化器种类:, w误差:0.0181, b误差:1.2160
epochs:200, 优化器种类:, w误差:0.0046, b误差:0.3051
epochs:200, 优化器种类:, w误差:0.3739, b误差:0.3786
epochs:500, 优化器种类:, w误差:0.0000, b误差:0.0000
epochs:500, 优化器种类:, w误差:0.0135, b误差:0.9093
epochs:500, 优化器种类:, w误差:0.0050, b误差:0.3327
epochs:500, 优化器种类:, w误差:0.0027, b误差:0.0172
epochs:1000, 优化器种类:, w误差:0.0000, b误差:0.0000
epochs:1000, 优化器种类:, w误差:0.0083, b误差:0.5563
epochs:1000, 优化器种类:, w误差:0.0141, b误差:0.9425
epochs:1000, 优化器种类:, w误差:0.0101, b误差:0.4870

从上面的运行结果可以看出:
在epochs为100时,Adam优化器效果最优,SGD优化器次优;
在epochs为200时,Adam优化器效果最优,Adagrad优化器次优;
在epochs为500时,Adam优化器效果最优,Adadelta优化器次优;
在epochs为1000时,Adam优化器效果最优。

1.结论

对于线性方程的回归模型,使用Adam优化器能够得到不错的拟合效果。

你可能感兴趣的:(基于keras的线性方程回归模型)