使用 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.01
或 0.1
中的任何一个都可以正常工作。进行此修改后,您可能不需要对模型进行 200 个 epoch 的训练。甚至 5、10 或 20 个 epoch 可能就足够了。
另请注意,您正在执行回归任务(即预测实数),'accuracy'
在执行分类任务(即预测图像类别等离散标签)时使用指标。因此,正如您在上面看到的,我已将其替换为 mae
(即平均绝对误差),这也比此处使用的损失值(即均方误差)更易于解释。
【讨论】:
我提供了一个完全符合直线的数据。因此,预期损失应该是 0。但是通过这个计算,损失在 0.015 附近波动。这是模型的固有问题还是可以完善以获得更好的价值? @mathnoob123 这是由于神经网络的优化方法,它是基于梯度和渐进的,也由于使用了优化器。我想由于您的案例很简单,因此您可以使用不太复杂的优化器(例如简单的随机梯度方法)获得更好的结果,即optimizers.SGD()
,学习率为lr=0.1
。我猜在 200 个 epoch 之后,使用 SGD 会损失大约 1e-4
或 1e-5
。但由于优化过程是循序渐进的,而不是确定的,所以不要期望达到精确的零损失。以上是关于使用 Keras 的简单线性回归的主要内容,如果未能解决你的问题,请参考以下文章