【问题标题】:Simple Linear Regression using Keras使用 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.')

生成的情节如下:

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

【问题讨论】:

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


    【解决方案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。但由于优化过程是循序渐进的,而不是确定的,所以不要期望达到精确的零损失。
      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 2016-04-14
      • 1970-01-01
      • 2017-12-01
      • 2014-05-04
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      相关资源
      最近更新 更多