我正在使用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]]和许多其他变化。
答案 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稍微好一些。