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

2024-04-25 04:07:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个简单的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个值进行预测。。。你知道吗


Tags: fromtestimportnumpyaddfordatamodel
1条回答
网友
1楼 · 发布于 2024-04-25 04:07:16

你的架构对于这个功能来说太简单了。如果您使用下面的体系结构并训练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'))

升级: 为什么一个简单的模型不能很好地工作?

其中一个原因是,如果一个神经元在每个数据点上都变为负,那么它的梯度就变为零,它的权值就不再训练了。你一开始只有很少的神经元,如果其中一些神经元以这种方式“死亡”,那么剩下的神经元可能不足以接近这个功能。你知道吗

另一个问题是,更少的神经元使得模型更容易陷入局部极小值。你知道吗

然而,理论上你是对的,仅仅几个神经元就足够了。 下面的模型即使只有一层也能工作。我已经用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)

相关问题 更多 >