Keras上基于TensorFlow实现简单线性回归模型

来源:互联网 发布:查看磁盘空间 linux 编辑:程序博客网 时间:2024/06/01 09:10

神经网络可以用来模拟回归问题。
首先回归问题是什么,回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等,例如一个产品的实际价格为500元,通过回归分析预测值为499元,我们认为这是一个比较好的回归分析。一个比较常见的回归算法是线性回归算法(LR)。另外,回归分析用在神经网络上,其最上层是不需要加上softmax函数的,而是直接对前一层累加即可。回强调内容归是对真实值的一种逼近预测。
这里我们就是用一条线段来对一些连续的数据进行拟合,进而我们可以通过这个曲线预测出新的输出值。
首先是数据图:
这里写图片描述
我们需要做的就是将其用一条直线将其取代。类似下图:
这里写图片描述
一、根据代码对其进行详细解读
1.导入的模块
导入本例子需要的模块,numpy、Matplotlib、kears.models和keras.models模块。Sequential()是多个网络层的线性堆叠。可以直接在其内部加入各个网络层或者通过 add()函数一个一个将网络层加入其中。Dense是全连接神经网络层。

model.add(Dense(64, input_dim=64, W_regularizer=l2(0.01), activity_regularizer=activity_l2(0.01)))
Dense层包括output_dim(输出维度)、input_dim(输入维度)、activation(激活函数)、weights(权值)、W_regularizer(施加在权值上的正则项)、b_regularizer(施加在偏置向量上的正则项)、activity_regularizer(施加在输出上的正则项)、W_constraints(施加在权值上的约束项)、b_constraints、bias(布尔值,是否包含偏置向量)这些参数。

2.数据的生成
利用numpy中的linspace()函数生成200个-1~~1之间的等差数列X,然后根据线性函数生成Y,并对Y添加噪音。这样就得到了数据,下面我们需要对数据进行分类分成两类一类是训练集一类是测试集。我们分配前160为训练集,后40为测试集。

3.建立模型
因为回归问题比较简单我们只需要一个层就可以了。
首先我们用Sequential建立一个模型,然后向其中添加Dense全连接神经层。参数这里是一个是输入数据的维度,另一个units代表神经元数,即输出单元数。如果需要添加下一个神经层的时候,不用再定义输入的纬度,因为它默认就把前一层的输出作为当前层的输入。在这个简单的例子里,只需要一层就够了(这是基于TensorFlow,如果是Theano,则需要将参数units换为output_dim)。

4.编译模型

model.compile()来编译和激活模型,这里我们用的损失函数是mse均方误差;优化器用的是sgd随机梯度下降。

compile(self, optimizer, loss, metrics=[], loss_weights=None, sample_weight_mode=None)

本函数编译模型以供训练,参数有
optimizer:优化器,为预定义优化器名或优化器对象,参考优化器
loss:目标函数,为预定义损失函数名或一个目标函数,参考目标函数
metrics:列表,包含评估模型在训练和测试时的性能的指标,典型用法是 metrics=[‘accuracy’] 如果
Keras中文文档
要在多输出模型中为不同的输出指定不同的指标,可像该参数传递一个字典,例如 metrics=
{‘ouput_a’: ‘accuracy’}
sample_weight_mode:如果你需要按时间步为样本赋权(2D权矩阵),将该值设为“temporal”。
默认为“None”,代表按样本赋权(1D权)。如果模型有多个输出,可以向该参数传入指
定sample_weight_mode的字典或列表。在下面 fit 函数的解释中有相关的参考内容。
kwargs:使用TensorFlow作为后端请忽略该参数,若使用Theano作为后端,kwargs的值将会传递
给 K.function

5.训练模型
训练的时候用 model.train_on_batch 一批一批的训练 X_train, Y_train。默认的返回值是 cost,每100步输出一下结果。

train_on_batch(self, x, y, class_weight=None, sample_weight=None)

本函数在一个batch的数据上进行一次参数更新
函数返回训练误差的标量值或标量值的list,与evaluate的情形相同。

6.验证模型
用到的函数是 model.evaluate,输入测试集的x和y,输出 cost,weights 和 biases。其中 weights 和 biases 是取在模型的第一层 model.layers[0] 学习到的参数。

evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)

本函数按batch计算在某些输入数据上模型的误差,其参数有:
x:输入数据,与 fit 一样,是numpy array或numpy array的list
y:标签,numpy array
batch_size:整数,含义同 fit 的同名参数
verbose:含义同 fit 的同名参数,但只能取0或1
sample_weight:numpy array,含义同 fit 的同名参数
本函数返回一个测试误差的标量值(如果模型没有其他评价指标),或一个标量的list(如果模型还有
其他的评价指标)。
二、完整代码

import numpy as npnp.random.seed(1337)from keras.models import Sequentialfrom keras.layers import Denseimport matplotlib.pyplot as plt/*创建数据集*/X=np.linspace(-1,1,200)np.random.shuffle(X)Y=0.5*X+2+np.random.normal(0,0.05,(200,))/*可视化*/plt.scatter(X,Y)plt.show()X_train,Y_train=X[:160],Y[:160]X_test,Y_test=X[160:],Y[160:]/*建立神经网络模型*/model=Sequential()model.add(Dense(input_dim=1,units=1))/*编译,选定loss函数和优化器*/model.compile(loss='mse',optimizer='sgd')/*训练过程*/print('Training--------------')for  step in range(501):    cost=model.train_on_batch(X_train,Y_train)    if step%100==0:        print('train_cost: ',cost)/*测试过程*/print('\nTesting--------------')cost=model.evaluate(X_test,Y_test,batch_size=40)print('test cost:',cost)W, b=model.layers[0].get_weights()print('weight= ',W,'\nbiases=',b)/*结果的可视化*/Y_pred=model.predict(X_test)plt.scatter(X_test,Y_test)plt.plot(X_test,Y_pred)plt.show()