问题描述
我正在学习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.]]