使用 Keras 的简单线性回归

Posted

技术标签:

【中文标题】使用 Keras 的简单线性回归【英文标题】:Simple Linear Regression using Keras 【发布时间】:2018-12-13 08:25:12 【问题描述】:

我一直在尝试使用 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.')

生成的情节如下:

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

【问题讨论】:

【参考方案1】:

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

@mathnoob123 模型作为书面和学习率 (lr) = 0.01 在 2968 个 epoch 中损失 =1.2623e-06

但是用 Adam 替换 RMSprop 优化器的相同模型在 2387 个 epoch 中损失为 1.22e-11 最准确。

我发现的最佳折衷方案是使用 lr=0.01 的 @mathnoob123 模型在 230 个 epoch 中导致 loss=1.5052e-4。这优于@Kunam 的模型,在第一个密集层中有 20 个节点,lr=0.001: loss=3.1824e-4 in 226 epochs。

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

【讨论】:

【参考方案2】:

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

看看这个。

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

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

我们的模型变得更加智能。 和最合适的。

我希望你明白了。

谢谢

【讨论】:

我正在使用 TF2。这对我来说似乎比接受的答案更好。 我希望你明白了。【参考方案3】:

您应该提高优化器的学习率。 RMSprop优化器中学习率的默认值设置为0.001,因此模型需要几百个epoch才能收敛到最终解决方案(可能您自己已经注意到,损失值下降缓慢,如训练所示日志)。设置学习率导入optimizers模块:

from keras import optimizers

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

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

另请注意,您正在执行回归任务(即预测实数),'accuracy' 在执行分类任务(即预测图像类别等离散标签)时使用指标。因此,正如您在上面看到的,我已将其替换为 mae(即平均绝对误差),这也比此处使用的损失值(即均方误差)更易于解释。

【讨论】:

我提供了一个完全符合直线的数据。因此,预期损失应该是 0。但是通过这个计算,损失在 0.015 附近波动。这是模型的固有问题还是可以完善以获得更好的价值? @mathnoob123 这是由于神经网络的优化方法,它是基于梯度和渐进的,也由于使用了优化器。我想由于您的案例很简单,因此您可以使用不太复杂的优化器(例如简单的随机梯度方法)获得更好的结果,即optimizers.SGD(),学习率为lr=0.1。我猜在 200 个 epoch 之后,使用 SGD 会损失大约 1e-41e-5。但由于优化过程是循序渐进的,而不是确定的,所以不要期望达到精确的零损失。

以上是关于使用 Keras 的简单线性回归的主要内容,如果未能解决你的问题,请参考以下文章

Keras 自定义损失(chi2)线性回归

在 tf.keras 中理解线性回归模型调优的问题

Keras实践:实现非线性回归

一线性回归的两种实现方式:keras实现

如何使用 tensorflow 或 keras 重新训练具有新子集的线性回归模型?

为 Keras ANN-线性回归选择层/函数