【问题标题】:Keras: Accuracy stays zeroKeras:准确度为零
【发布时间】:2017-10-09 09:06:42
【问题描述】:

我正在尝试使用 Keras 进行机器学习。

我不是数学家,我对神经网络的工作原理只有基本的了解(哈哈,明白了吗?),所以放轻松。

这是我当前的代码:

from keras.utils import plot_model
from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
import numpy

# fix random seed for reproducibility
numpy.random.seed(7)

# split into input (X) and output (Y) variables
X = []
Y = []
count = 0

while count < 10000:
    count += 1
    X += [count / 10000]
    numpy.random.seed(count)
    #Y += [numpy.random.randint(1, 101) / 100]
    Y += [(count + 1) / 100]
print(str(X) + ' ' + str(Y))

# create model
model = Sequential()
model.add(Dense(50, input_dim=1, kernel_initializer = 'uniform', activation='relu'))
model.add(Dense(50, kernel_initializer = 'uniform', activation='relu'))
model.add(Dense(1, kernel_initializer = 'uniform', activation='sigmoid'))

# Compile model
opt = optimizers.SGD(lr=0.01)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])

# Fit the model
model.fit(X, Y, epochs=150, batch_size=100)

# evaluate the model
scores = model.evaluate(X, Y)
predictions = model.predict(X)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
print (str(predictions))
##plot_model(model, to_file='C:/Users/Markus/Desktop/model.png')

准确度保持为零,预测为 1 数组。我做错了什么?

【问题讨论】:

    标签: python python-3.x keras


    【解决方案1】:

    据我所知,您正在尝试解决回归问题(浮点函数输出)而不是分类问题(一个热向量样式输出/将输入分类)。

    你的 sigmoid 最后一层只会给出 0 到 1 之间的输出,这显然限制了你的神经网络预测所需 Y 值范围的能力,而 Y 值的范围要高得多。您的 NN 正试图尽可能接近,但您正在限制它!输出层中的 Sigmoid 适合单类 yes/no 输出,但不适用于回归。

    因此,您希望最后一层具有线性激活,其中输入只是相加。像这样的东西而不是 sigmoid。 model.add(Dense(1, kernel_initializer='lecun_normal', activation='linear'))

    那么它可能会起作用,至少如果学习率足够低的话。

    谷歌“keras 回归”寻找有用的链接。

    【讨论】:

      【解决方案2】:

      看起来您正在尝试使用binary_crossentropy 损失函数进行二元分类。但是,类标签Y 是浮点数。标签应该是 0 或 1。所以最大的问题在于您为模型提供训练的输入数据。

      您可以尝试一些更有意义的数据,例如从两个不同的正态分布中抽取数据的两个类,并且每个观察的标签为 0 或 1:

      X = np.concatenate([np.random.randn(10000)/2, np.random.randn(10000)/2+1])
      
      Y = np.concatenate([np.zeros(10000), np.ones(10000)])
      

      模型应该能够使用这种类型的数据去某个地方。

      【讨论】:

      • 难道没有办法进行浮点预测吗?
      • 是的,你可以。您需要将损失函数更改为均方误差。检查这个:[](keras.io/losses)。此外,您可能希望删除最后一层中的 sigmoid 激活...
      • 好的,我让它工作了。但是损失会以很小的幅度减少,几乎没有。你会推荐什么样的网络参数?
      • 很难说。要做的一件事是对一小部分数据集进行训练并对其进行过度拟合(损失接近 0)。您可以尝试两件事:优化器的不同学习率和不同的优化器。大多数优化器可能会比 SGD 工作得更好。
      • 更改您正在使用的优化器的 LR 参数 - 在您的示例中为 SGD。 Adam 是一个很好的默认优化器,而不是 SGD。
      猜你喜欢
      • 1970-01-01
      • 2020-01-08
      • 2021-12-10
      • 2023-03-29
      • 2020-11-13
      • 2022-01-15
      • 2017-12-13
      • 2021-07-27
      • 2018-10-09
      相关资源
      最近更新 更多