开始使用Keras进行机器学习

时间:2017-07-04 17:21:36

标签: python python-3.x machine-learning tensorflow keras

我开始使用机器学习工具了,我想了解更多关于我正在做什么的知识。例如,脚本:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, BatchNormalization
from keras.initializers import RandomUniform
import numpy

numpy.random.seed(13)
RandomUniform(seed=13)

model = Sequential()

model.add(Dense(6, input_dim=6))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.01))

model.add(Dense(11))
model.add(Activation('tanh'))
model.add(Dropout(0.01))

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(optimizer='sgd', loss='mean_absolute_error', metrics=['accuracy'])

data = numpy.loadtxt('train', delimiter=' ')
X = data[:, 0:6]
Y = data[:, 6]

model.fit(X, Y, batch_size=1, epochs=1000)

data = numpy.loadtxt('test', delimiter=' ')
X = data[:, 0:6]
Y = data[:, 6]

score = model.evaluate(X, Y, verbose=1)
print ('\n\nThe error is:\n', score, "\n")

print('\n\nPrediction:\n')
Y = model.predict(X, batch_size=1, verbose=1)
print('\nResult:\n', Y, '\n')

这是一个弗兰肯斯坦,我是从互联网上找到的一些例子中得出的,我有很多未解答的问题:

  1. 文件 train 有60行。 1000个时代太少了吗?太多了吗?我可以买一件Underfit / Overfit吗?
  2. 我从model.evaluate()得到的结果是什么意思?我知道这是损失但是,如果我得到[7.0506157875061035,0.0],这是否意味着我的模型有7%的错误?
  3. 最后,当预期值接近7.86,3.57,8.93,6.57,11.7,8.53,9.06时,我的预测值为0.99875391,0.99875391,0.9362126,0.99875391,0.996875391,0.9975751,0.93571019这是一个非常糟糕的预测。很明显,我做错了很多事情。你们能给我一些指示吗?
  4. 我知道这一切都取决于我正在使用的数据类型,但有什么我根本不应该做的吗?或者也许我应该做的事情?

2 个答案:

答案 0 :(得分:3)

1

对于多少个时代来说,一个好的数字永远不会有一个现成的答案。它根据您的数据大小,您的模型以及您想要实现的目标而有很大差异。通常,小型号需要更少的时代,更大的型号需要更多。你的看起来足够小,1000个时代似乎太多了。

它还取决于learning rate,这是一个给优化器的参数,它定义了模型更新其权重所需的步数。更大的学习率意味着更少的时代,但是你有可能从来没有找到一个好点,因为你正在调整权重超出好处。较小的学习率意味着更多的时代和更好的学习。

通常情况下,如果损失达到极限,您将接近训练无效的点。 (当然,模型也可能存在问题,这个问题确实没有简单的答案)。

要检测过度拟合,除了训练数据(X和Y)之外,还需要另一组包含测试数据(例如Xtest和Ytest)。

然后在model.fit(X,Y, validation_data=(Xtest,Ytest), ...)

中使用它

测试数据不是为培训提供的,而是保持独立,只是为了确定您的模型是否可以从培训中从未见过的数据中预测出好的东西。

如果训练损失减少,但验证损失没有,那么你就过度拟合了(粗略地说,你的模型能够记住训练数据而不能真正理解它)。

相反,当你从未达到预期的accuracy时,就会发生一种不足(当然我们总是期望100%的准确性,没有错误,但好的模特会在90年代左右,有些应用会更好99) %,有些更糟,再次,这是非常主观的)。

2

model.evaluate()为您提供了compile method中添加的损失和指标。

损失值是您的模型在训练期间总是会尝试减少的。它大致意味着您的模型与确切的值有多远。损失价值的含义没有规则,甚至可能是负数(但通常keras使用正亏损)。关键是:它必须在培训期间减少,这意味着您的模型正在发展。

准确度值表示模型输出与真实值(Y)相比的正确预测数量。看来你的准确度是0%,你的模型一切都搞错了。 (您可以从键入的值中看到)。

3

在您的模型中,您使用了activation functions。这些将结果标准化,因此它们不会变得太大。这可以避免溢出问题,传播数字错误等。

在这样的范围内处理值非常常见。

  • tanh - 输出介于-1和1之间的值
  • sigmoid - 输出介于0和1之间的值

好吧,如果您在最后一层使用了sigmoid激活,那么您的模型将永远不会输出3。它尝试,但最大值是1.

你应该做的是准备你的数据(Y),因此它包含在0和1之间。(这是分类问题中最好的,通常也用图像做)

但是如果你真的想要数值,那么你应该删除激活并让输出自由地达到更高的值。 (这完全取决于您希望通过模型实现的目标)

答案 1 :(得分:2)

  1. Epoch是完整训练集的单次传递。我的想法似乎很多,但你必须检查过度拟合并评估预测。有许多方法可以检查和控制模型中的过度拟合。如果您从here了解这样做的方法,那么在Keras中对它们进行编码应该没问题。

  2. 根据documentation .evaluate返回:

  3.   

    标量测试丢失(如果模型没有指标)或标量列表(如果模型计算其他指标)

    因此,这些是您的模型的评估指标,它们会告诉您模型有多好以获得一些好的概念。这些指标取决于您使用的模型和数据类型。可以找到关于这些的一些解释herehere。如文档中所述,

      

    属性model.metrics_names将为您提供标量输出的显示标签。

    因此,您可以知道您正在查看的指标。通过控制台(ipython,bpython)或Jupyter笔记本以交互方式更容易。

    1. 我无法看到您的数据,但是如果您正在执行metrics=['accuracy']建议的分类问题,loss=mean_absolute_error没有意义,因为它是针对回归问题而做的。要了解有关这些内容的更多信息,请转至herehere,与Keras讨论分类和回归问题。
    2. PS:问题3与软件本身无关,而与支持软件的理论构造无关。在这种情况下,我建议在Cross Validated询问他们。