我一直在尝试使用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.')
生成的图如下:
有人可以指出上述模型定义中的缺陷(可以确保更好的拟合度吗?)
答案 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.01
或0.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 = 17
#使用模型
regr = baseline_model()
regr.fit(data,y,epochs =200, verbose = 0)
plot(data, regr.predict(data), 'bo', data,y, 'k-')
第一个num_neurons = 17的图很合适。
但是即使我们可以探索更多。
单击下面的链接以查看图
您可以看到,随着我们增加神经元数量
我们的模型变得越来越智能。 最合适。
我希望你明白了。
谢谢
答案 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),看看会发生什么...。