2017-02-23 114 views
1

我需要关于机器学习模型训练准确性的帮助。机器学习精度显示为0

我的训练输入是有500个整数/数据的数组,我将它保存在hdf5文件中名为'the_data'的数据集下。在这个例子中,我有100个数组。

[[1,2,3,...500], 
[501,502,...1000], 
[1001,...  ], 
.... 
......   ]] 

输出是一个随机数,我手边生成并将其保存为'output.txt'。它有100个随机数。

194521, 307329, 182440, 180444, 275690,...,350879 

下面是基于http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

import h5py 
from keras.models import Sequential 
from keras.layers import Dense 

seed = 7 
np.random.seed(seed) 

input_data = h5py.File('test.h5', 'r') 
output_data = open("output.txt", "r") 

X = input_data['the_data'][:] 
Y = output_data.read().split(',') 

model = Sequential() 
model.add(Dense(500, input_dim=500, init='normal', activation='relu')) 
model.add(Dense(100, init='normal', activation='relu')) 
model.add(Dense(60, init='normal', activation='relu')) 
model.add(Dense(1, init='normal', activation='sigmoid')) 

model.compile(loss='binary_crossentropy', optimizer='adamax', metrics=['accuracy']) 
model.fit(X, Y, nb_epoch=500, batch_size=10) 
scores = model.evaluate(X, Y) 

print("%s: %.2f%% , %s: %.2f%%" % (model.metrics_names[0], scores[0]*100, model.metrics_names[1], scores[1]*100)) 

我得到了作为结果就像是我修改后的脚本这个

Epoch 500/500 
100/100 [==============================] - 0s - loss: -4851446.0896 - acc: 0.0000e+00 
100/100 [==============================] - 0s 
loss: -485144614.93% , acc: 0.00% 

有谁有关于为什么会发生这种情况的任何想法?

谢谢你的帮助。

回答

3

你知道二进制crossentropy是什么吗?

这是一个针对二进制(0或1)目标的损失函数。根据目标值,损失是outputoutput - 1的一些对数。 所以你不能在你的情况下应用它。

你想要预测数值,所以你应该使用像均方根误差之类的东西。

准确性并没有做出任何反应,因为您并不是在试图预测一个班级,而是一个实数值。它很少会预测到好的一个。准确性用于例如二进制交叉熵,然后我们可以将0.7的输出分类为1级。或者0.2级为0级。

还有一条评论:为什么要预测随机值?它无法工作......网络需要识别模式,并且随机目标中没有模式。

我希望这可以帮助你一点。

+0

是的,谢谢你为我指出二进制crossentropy。我没有太多的想法,因为我太专注于输出。我会更多地关注你的建议。 此外,我只是想尝试如果网络也可以识别数值作为输出。没有其他原因。 谢谢你的回答。 – Fang

1

我同意纳西姆本。 尝试使用这个

model.compile(loss='mean_square', optimizer='sgd') 

然后,计算你需要以不同的方式精度:

from sklearn.metrics import mean_squared_error 

mse = mean_squared_error(Y,Y_predicted) 

print('MSE : %.3f' % mse) 
print("Acc = ", 1-numpy.sqrt(mse)) 

这为我工作。但说实话,我觉得keras在预测高数字方面表现不佳(其他则在0和1之间) 如果我错了,我会很高兴。

+0

谢谢你的回答。我没有搜索关于'mean_square'的内容,但并不了解如何使用它。我会按照您的建议尝试,并会根据我的问题进行更新。 – Fang

+0

这就是为什么建议对输入和目标进行标准化的原因。如果你使用像sigmoid或tanh这样的激活因为它们会限制输出,它也不会奏效。 –