使用Keras进行简单的线性回归

时间:2018-07-04 22:27:31

标签: python machine-learning neural-network keras linear-regression

我一直在尝试使用Keras中的神经网络实现简单的线性回归模型,以期了解我们如何在Keras库中工作。不幸的是,我最终得到了一个非常糟糕的模型。这是实现:

from pylab import *
from keras.models import Sequential
from keras.layers import Dense

#Generate dummy data
data = data = linspace(1,2,100).reshape(-1,1)
y = data*5

#Define the model
def baseline_model():
   model = Sequential()
   model.add(Dense(1, activation = 'linear', input_dim = 1))
   model.compile(optimizer = 'rmsprop', loss = 'mean_squared_error', metrics = ['accuracy'])
   return model


#Use the model
regr = baseline_model()
regr.fit(data,y,epochs =200,batch_size = 32)
plot(data, regr.predict(data), 'b', data,y, 'k.')

生成的图如下:

Plot

有人可以指出上述模型定义中的缺陷(可以确保更好的拟合度吗?)

3 个答案:

答案 0 :(得分:5)

您应该提高优化器的学习率。 RMSprop优化器中学习率的默认值设置为0.001,因此该模型需要几百个纪元收敛到最终解(可能您自己已经注意到,损失值随着在培训日志中显示)。要设置学习率导入optimizers模块,请执行以下操作:

from keras import optimizers

# ...
model.compile(optimizer=optimizers.RMSprop(lr=0.1), loss='mean_squared_error', metrics=['mae'])

0.010.1中的任何一个都可以正常工作。进行此修改后,您可能不需要训练模型200个纪元。甚至5、10或20个纪元就足够了。

还请注意,您正在执行回归任务(即,预测实数),并且在执行分类任务(即,预测离散标签,例如图像类别)时使用'accuracy'作为度量标准。因此,如您在上面看到的那样,我已将其替换为mae(即平均绝对误差),它比此处使用的损失值(即均方误差)更具解释性。

答案 1 :(得分:0)

  

以下代码最适合您的数据。

     

看看这个。

from pylab import *
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
%matplotlib inline

#生成伪数据

data = data = linspace(1,2,100).reshape(-1,1)
y = data*5

##定义模型

def baseline_model():
    global num_neurons
    model = Sequential()
    model.add(Dense(num_neurons, activation = 'linear', input_dim = 1))
    model.add(Dense(1 , activation = 'linear'))
    model.compile(optimizer = 'rmsprop', loss = 'mean_squared_error')
    return model

在第一个致密层中设置num_neurons

**您可以稍后更改

num_neurons = 17

#使用模型

regr = baseline_model()
regr.fit(data,y,epochs =200, verbose = 0)
plot(data, regr.predict(data), 'bo', data,y, 'k-')
  

第一个num_neurons = 17的图很合适。

     

但是即使我们可以探索更多。

     

单击下面的链接以查看图

Plot for num_neurons = 12

Plot for num_neurons = 17

Plot for num_neurons = 19

Plot for num_neurons = 20

您可以看到,随着我们增加神经元数量

我们的模型变得越来越智能。 最合适。

  

我希望你明白了。

     

谢谢

答案 2 :(得分:0)

有趣的问题,所以我将数据集插入到我编写的模型构建器框架中。该框架有两个回调:针对“损失”的EarlyStopping回调和用于分析的Tensorboard。我从模型编译中删除了“指标”属性-不必要,无论如何应为“主要”。

@ mathnoob123模型为书面形式,学习率(lr)= 0.01,在2968个时期内损失= 1.2623e-06

但是用Adam代替RMSprop优化器的同一模型最准确,在2387个时代损失= 1.22e-11。

我发现的最佳折衷方案是@ mathnoob123模型,使用lr = 0.01导致230个时代的损失= 1.5052e-4。这要好于@Kunam模型,该模型在第一个密集层中有20个节点,lr = 0.001:在226个时期内loss = 3.1824e-4。

现在,我将随机化标签数据集(y),看看会发生什么...。