Keras:准确率保持为零

Mar*_*pel 2 python python-3.x keras

我正在尝试使用 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')
Run Code Online (Sandbox Code Playgroud)

准确度保持为零,并且预测是 1 的数组。我究竟做错了什么?

Tom*_*ker 5

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

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

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

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

谷歌“keras 回归”以获取有用的链接。