神经网络在1000个周期后无法学习以解决XOR问题

问题描述

我正在学习TensorFlow,并且正在尝试解决XOR问题。我创建了一个三层的神经网络来做到这一点,但是经过500或1000个时期后,它根本没有学习。我在做什么错了?

我正在colab.research.google中使用TensorFlow 2.3.0。

from tensorflow.keras.layers import Dense
from tensorflow.keras.losses import MeanSquaredError
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.metrics import Accuracy
from tensorflow.keras import Sequential

import numpy as np



x = np.array([[0.,0.],[1.,1.],[0.,1.]],dtype=np.float32)

y = np.array([[0.],[0.],[1.],[1.]],dtype=np.float32)



model = Sequential()
model.add(Dense(2,activation='sigmoid'))
model.add(Dense(2,activation='sigmoid'))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='SGD',loss='mean_squared_error',metrics='accuracy')
model.fit(x,y,batch_size=1,epochs=1000,verbose=False)

pred = model.predict_on_batch(x)
print(pred)

解决方法

由于您提到的隐藏层单位为2,即Dense(2),对于具有2个输入的数组输入,这不足以使模型学习。 我包括16个单位,您可以尝试使用32,64个等单位。

对于神经网络中的隐藏层,最好使用激活函数ReLu。 (有关此问题的更多详细信息,请参阅Mark的评论。)
但是对于这种用例,您可以不提及任何激活功能,但是收敛到解决方案需要花费更多的时间。

下面是经过修改的代码,它以较少的时期数预测正确的输出。

import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras.losses import MeanSquaredError
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.metrics import Accuracy
from tensorflow.keras import Sequential

import numpy as np



x = np.array([[0.,0.],[1.,1.],[0.,1.]],dtype=np.float32)

y = np.array([[0.],[0.],[1.],[1.]],dtype=np.float32)



model = Sequential()
model.add(Dense(16,activation='relu'))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='SGD',loss='mean_squared_error',metrics=['accuracy'])
model.fit(x,y,batch_size=1,epochs=500,verbose=False)

pred = model.predict(x).round()
print(pred) 

输出:

[[0.]
 [0.]
 [1.]
 [1.]]