我创建了一个简单的2-2-1前馈神经网络来使用Keras来预测异或。
我在所有层上使用的激活函数是tanh,因此为了使用函数的整个范围,即-1,1,我决定使用-1而不是0作为符号。
因此,我的输入数据是[[-1, -1], [-1, 1], [1, -1], [1, 1]],用于[[-1], [1], [1], [-1]]的输出。
我认为这会带来更好的结果,因为我使用了整个函数范围,因此它应该会更好地收敛。另外,由于我只是使用不同的符号,所以它应该与使用0和1相同。
然而,我的网络不能收敛(给出0.5的精度),最让我困惑的是使用0和1作为符号收敛,而且速度快得多。
这种违反直觉的事情(至少在我的观念中是如此)是否有发生的原因?
发布于 2018-04-23 06:47:54
我尝试了这个实验,并取得了一些积极的结果。我将描述我尝试过的内容,也许您可以指定差异所在,我们可以进一步探讨它们。从我的努力来看,我会认为你训练的时间不够长。
import numpy as np
n = 100000
x_train = np.zeros((n,2))
y_train = np.zeros((n,))
for i in range(n):
x_train[i,0] = np.random.choice([-1,1])
x_train[i,1] = np.random.choice([-1,1])
if x_train[i,0] == 1 and x_train[i,1] == 1 or x_train[i,0] == -1 and x_train[i,1] == -1:
y_train[i] = -1
else:
y_train[i] = 1
x_train = x_train.reshape(n, 2,)
n = 1000
x_test = np.zeros((n,2))
y_test = np.zeros((n,))
for i in range(n):
x_test[i,0] = np.random.choice([-1,1])
x_test[i,1] = np.random.choice([-1,1])
if x_test[i,0] == 1 and x_test[i,1] == 1 or x_test[i,0] == -1 and x_test[i,1] == -1:
y_test[i] = -1
else:
y_test[i] = 1
x_test = x_test.reshape(n, 2,)
print(x_test[0].T)
print(y_test[0])1. 1. -1.0
正如您所描述的,模型是两个输入节点、两个隐藏节点和一个输出节点。每个节点都使用tanh作为其激活函数。
input_shape = (2,)
model = Sequential()
model.add(Dense(2, activation='tanh',
input_shape=input_shape))
model.add(Dense(2, activation='tanh'))
model.add(Dense(1, activation='tanh'))
model.compile(loss=keras.losses.mean_squared_error,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])模型
因为我生成了许多数据实例,所以我只训练了10个时期。然而,如果您的输入空间只是四个可能的输入,您可能需要数千个时代。神经网络确实需要很长时间才能收敛。
epochs = 10
batch_size = 128
# Fit the model weights.
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))10/10 100000/100000 ============================== - 1s 9us/步进损失: 9.3983e-05 - acc: 1.0000 - val_loss: 7.9096e-05 - val_acc: 1.0000

https://datascience.stackexchange.com/questions/30662
复制相似问题