我制作了一个简单的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个值来预测的...
答案 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)