为什么我不能为XNOR训练ANN?

时间:2019-10-26 15:44:15

标签: python numpy tensorflow machine-learning keras

我制作了一个简单的NN来确定输入层中具有两个二进制值的XNOR值。 我将Numpy数组与所有可能的组合组合在一起。

代码:

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

data = numpy.array([[0.,0.,1.],[0.,1.,0.],[1.,0.,0.],[1.,1.,1.]])
train = data[:,:-1] # Taking The same and All data for training
test = data[:,:-1]  

train_l = data[:,-1]
test_l = data[:,-1]

train_label = []
test_label = []

for i in train_l:
    train_label.append([i])
for i in test_l:
    test_label.append([i])   # Just made Labels Single element...

train_label = numpy.array(train_label)
test_label = numpy.array(test_label)  # Numpy Conversion


model = Sequential()

model.add(Dense(2,input_dim = 2,activation = 'relu'))
model.add(Dense(2,activation = 'relu'))
model.add(Dense(1,activation = 'relu'))

model.compile(loss = "binary_crossentropy" , metrics = ['accuracy'], optimizer = 'adam')

model.fit(train,train_label, epochs = 10, verbose=2)

model.predict_classes(test)

即使采用相同的数据集进行训练和测试...也无法正确预测... 我在哪里错了?

我故意提取了整个数据集,因为它不是用2个值来预测的...

1 个答案:

答案 0 :(得分:0)

您的架构对于此功能而言太简单了。如果您使用下面的架构并训练100个纪元,那么您将获得的准确度= 1。

model = Sequential()
model.add(Dense(20,input_dim = 2,activation = 'relu'))
model.add(Dense(20,activation = 'relu'))
model.add(Dense(1,activation = 'sigmoid'))

UPD: 为什么简单的模型不能很好地起作用?

一个原因是,通过ReLU激活,如果一个神经元在每个数据点上变为负数,则其梯度将变为零,并且其权重将不再训练。开始时神经元很少,如果其中一些神经元以这种方式“死亡”,则剩余的神经元可能不足以近似该功能。

另一个问题是,较少的神经元使模型更有可能陷入局部最小值。

但是,从理论上讲,只需几个神经元就足够了。 下面的模型仅适用于一层。我用LeakyReLU替换了ReLU,以解决第一个问题。它在大多数时间都有效,但有时会陷入局部最小值。

model = Sequential()

model.add(Dense(2,input_dim = 2,activation = LeakyReLU(alpha=0.3)))
model.add(Dense(1,activation = 'sigmoid'))

optimizer = Adam(lr=0.01)
model.compile(loss = "binary_crossentropy" , metrics = ['accuracy'], optimizer=optimizer)

model.fit(train,train_label, epochs = 500, verbose=2)