Keras神经无法训练/根本没有改善/准确度(acc。)保持恒定值

时间:2016-11-28 15:50:24

标签: python-2.7 machine-learning keras

有时训练完全失败,整个训练的准确性保持不变。在另一种情况下,ANN可以通过足够的迭代完美地适应。

我的ANN没有任何中间层。只有K个输入和一个输出。其中一个功能就是输出。这只是一个玩具模型我想测试我更复杂的模型。 实际上,问题也出现在"高" -dimonsional输入中。

我也改变了优化器,学习率等等。它在几台主机上运行。代码是一个黑客但显示问题。

有谁可以指出这个问题?谢谢!

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np


model = Sequential()

a = np.array( range(1,100) ) # one vector

#X_train = a                         # is working, OK
X_train = np.squeeze(np.hstack((
                                  a[:,None],
                                  a[:,None]+10,
                                  a[:,None]+20,
                                  a[:,None]+30,
                                  a[:,None]+40,
                                  a[:,None]+50,
                                  a[:,None]+50,
                                  a[:,None]+50,
                                  a[:,None]+50,
                                  a[:,None]+100,
                                  a[:,None]+100,
                                  a[:,None]+100,
                                  a[:,None]+100,
                                  a[:,None]+100,
                                  a[:,None]+100,
                                  a[:,None]*10,
                                  a[:,None]*10,
                                  a[:,None]*10,
                                  a[:,None]*10,
                                  a[:,None]*100,
                                  a[:,None]*100,
                                  a[:,None]*100,
                                  a[:,None]*100,
                                  a[:,None]*100,
                                  a[:,None]*100,
                                  a[:,None]*100,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01,
                                  a[:,None]*0.01
                    )))

model.add(Dense( 1, input_dim=np.size(X_train[0,:]))   # in
model.add(Dense(1,activation="relu"))     # out

'''
https://keras.io/optimizers/#adam
'''

optimizer = keras.optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(
              loss="mean_squared_error",
              optimizer=optimizer)
              #metrics=['accuracy'])
Y_train = a

model.fit( X_train, Y_train,
           nb_epoch=200,
           batch_size=10 )

X_test = X_train      # training equals test set
Y_test = Y_train
score = model.evaluate(X_test, Y_test, batch_size=16)
print(str(score))

outputPred = model.predict(X_test)

print("X_train:" +str(X_train))
print("Y_train:" +str(Y_train))
print("prediction is")
print(str(outputPred))

1 个答案:

答案 0 :(得分:-1)

似乎优化器需要适当的格式。即使输入位于域[0,K]中,也无法通过激活" relu"来优化输入。

规范化有助于:使输入和输出数据居中,带来改进。此外,但不是必需的,更小的范围,例如wdith为1。

激活" relu "仅适用于这种不错的数据格式。

激活" tanh "在小范围内收敛得更好(max-min = 1)。

在显示的极端测试案例中," 线性"突然收敛。

总而言之,如果数据采用优化程序无法处理的格式,则培训可能会失败。即使它很容易实现,例如在一个输入和单个输出之间的1:1映射。

在正确的层次上考虑兼容激活。考虑到成功还取决于优化器,损失函数和度量。