基于Keras的神经网络不训练

时间:2017-06-23 12:29:33

标签: machine-learning neural-network keras

我正在使用Keras库训练这个非常简单的神经网络。

对于时代数量的无效,即使对于训练集中涵盖的情况,NN也无法正确预测。

我在这里做错了什么。

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

model = Sequential()
model.add(Dense(3, input_dim=3))
model.add(Activation('sigmoid'))
model.add(Dense(3, activation='softmax'))

sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

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


inputData=[[0,0,1],[0,1,0],[1,0,0]]
outputData=[[0,0,1],[0,1,0],[1,0,0]]

numpy_input=np.array(inputData).reshape(len(inputData),3)
numpy_output=np.array(outputData).reshape(len(inputData),3)

model.fit(numpy_input, numpy_output, nb_epoch=20, batch_size=3,verbose=1)

op=model.predict(np.array([0,0,1]).reshape(1,3))
print op

我得到的输出是[[0.41825652 0.32675183 0.25499159]]和许多其他变化。

2 个答案:

答案 0 :(得分:1)

试试这个

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

model = Sequential()
model.add(Dense(3, input_dim=3))
model.add(Activation('sigmoid'))
model.add(Dense(3, activation='softmax'))

sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

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


inputData=[[0,0,1],[0,1,0],[1,0,0]]
outputData=[[0,0,1],[0,1,0],[1,0,0]]

numpy_input=np.array(inputData)
numpy_output=np.array(outputData)

model.fit(numpy_input, numpy_output, nb_epoch=50, batch_size=3,verbose=1)

op=model.predict(np.array([[0,0,1]]))
print(op)

在我的机器中产生

[[ 0.30640799  0.34553316  0.34805891]]

建议输出为0 0 1

答案 1 :(得分:0)

您的主要问题是您没有为足够的时期运行它(nb_epoch=20太低):

Epoch 20/20
3/3 [==============================] - 0s - loss: 1.1682 - acc: 0.3333
[[ 0.2559461   0.40617985  0.33787408]]

显然这还不够好,让我们看看更多的时代是否有助于我们融合。经过一些试验和错误后,似乎需要大约至少250个时期来获得所需的输出:

Epoch 250/250
3/3 [==============================] - 0s - loss: 0.5997 - acc: 1.0000
[[ 0.06680837  0.27412242  0.65906924]]

它确实似乎收敛了,因为在500或2000个时代之后它更加接近

Epoch 500/500
3/3 [==============================] - 0s - loss: 0.1502 - acc: 1.0000
[[ 0.06663816  0.04986271  0.88349915]]


Epoch 2000/2000
3/3 [==============================] - 0s - loss: 0.0197 - acc: 1.0000
[[ 0.01536902  0.01592613  0.96870482]]

如果不清楚,我对您的代码所做的唯一更改是nb_epoch=250。 请注意,低至50的值有时会提供精度1.0,但在运行期间不稳定。对我来说250稳定。

尝试使用ReLU而不是Sigmoid:

@MarcinMożejko建议我们在你的例子中使用ReLU而不是Sigmoid,在250个时刻我得到了混合结果

Epoch 250/250
3/3 [==============================] - 0s - loss: 0.3139 - acc: 1.0000
[[ 0.22046153  0.14507896  0.6344595 ]]

Epoch 250/250
3/3 [==============================] - 0s - loss: 0.4994 - acc: 0.6667
[[ 0.04885471  0.47655082  0.47459444]]

有时它会很好地收敛于0和1

Epoch 250/250
3/3 [==============================] - 0s - loss: 0.0189 - acc: 1.0000
[[ 0.00779702  0.00919682  0.98300618]]

有500个epoches和ReLU我得到稳定的结果

Epoch 500/500
3/3 [==============================] - 0s - loss: 0.0263 - acc: 1.0000
[[ 0.0309988   0.03392733  0.93507391]]

所以确实ReLU似乎比具有相同时期的sigmoid稍微好一些。