我想练习keras代码,但结果是不正确的,以下是我的代码,感谢大家的帮助。
from keras.models import Sequential
from keras.layers.core import Dense,Activation
from keras.optimizers import SGD
import numpy as np
model = Sequential()# two layers
model.add(Dense(input_dim=2,output_dim=4,init="glorot_uniform"))
model.add(Activation("sigmoid"))
model.add(Dense(input_dim=4,output_dim=1,init="glorot_uniform"))
model.add(Activation("sigmoid"))
sgd = SGD(l2=0.0,lr=0.05, decay=1e-6, momentum=0.11, nesterov=True)
model.compile(loss='mean_absolute_error', optimizer=sgd)
print "begin to train"
list1 = [1,1]
label1 = [0]
list2 = [1,0]
label2 = [1]
list3 = [0,0]
label3 = [0]
list4 = [0,1]
label4 = [1]
train_data = np.array((list1,list2,list3,list4)) #four samples for epoch = 1000
label = np.array((label1,label2,label3,label4))
model.fit(train_data,label,nb_epoch = 1000,batch_size = 4,verbose = 1,shuffle=True,show_accuracy = True)
list_test = [0,1]
test = np.array((list_test,list1))
classes = model.predict(test)
print classes
输出
[[ 0.31851079] [ 0.34130159]] [[ 0.49635666] [0.51274764]]
如果我将代码中的epoch数增加到50000,它通常会收敛到我的正确答案,只是需要一点时间:)
但它确实经常卡住。如果我将损失函数更改为'mean_squared_error',我将获得更好的收敛特性,这是一个更平滑的函数。
如果我使用Adam或RMSProp优化器,我会得到更快的收敛。最后的编译行,可以工作:
model.compile(loss='mse', optimizer='adam')
...
model.fit(train_data, label, nb_epoch = 10000,batch_size = 4,verbose = 1,shuffle=True,show_accuracy = True)
我使用了一个包含4个隐藏节点的隐藏层,它几乎总是在500 epoch内收敛到正确答案。我使用了s形激活
使用Keras进行XOR训练
下面是学习异或所需的最小神经元网络架构,它应该是一个(2,2,1)网络。事实上,如果数学表明(2,2,1)网络可以解决异或问题,但数学并没有表明(2,2,1)网络容易训练。它有时可能需要很多次迭代,或者不会收敛到全局最小值。也就是说,我在(2,3,1)或(2,4,1)网络体系结构上很容易得到好的结果。
这个问题似乎与许多局部极小值的存在有关。看看这篇1998年的论文,《学习异或:探索经典问题的空间》,作者是Richard Bland。此外,使用介于0.5和1.0之间的随机数初始化权重有助于收敛。
它可以很好地与Keras或TensorFlow使用损失函数'mean_squared_error', sigmoid激活和Adam优化器。即使有非常好的超参数,我观察到学习到的异或模型在大约15%的时间内被困在局部最小值中。
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from tensorflow.keras import initializers
import numpy as np
X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([[0],[1],[1],[0]])
def initialize_weights(shape, dtype=None):
return np.random.normal(loc = 0.75, scale = 1e-2, size = shape)
model = Sequential()
model.add(Dense(2,
activation='sigmoid',
kernel_initializer=initialize_weights,
input_dim=2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracy'])
print("*** Training... ***")
model.fit(X, y, batch_size=4, epochs=10000, verbose=0)
print("*** Training done! ***")
print("*** Model prediction on [[0,0],[0,1],[1,0],[1,1]] ***")
# print(model.predict_proba(X))
print(model.predict([X])
* * *培训……* * *
***培训结束!* * *
* * *模型预测[[0],[0,1],[1,0],[1]]* * *
[[0.08662204][0.9235283][0.92356336][0.06672956]]