Нейронная сеть не обучается после 1000 эпох для решения проблемы XOR

#python #neural-network #tensorflow2.0 #xor

#python #нейронная сеть #tensorflow2.0 #xor

Вопрос:

Я изучаю TensorFlow и пытаюсь решить проблему XOR. Для этого я создал 3-слойную нейронную сеть, но после 500 или 1000 эпох она вообще не обучается. Что я делаю не так?

Я использую TensorFlow 2.3.0 в colab.research.google.

 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.],
              [1., 0.],
              [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)
  

Комментарии:

1. Я не эксперт в NN, но я бы попробовал ReLu вместо sigmoid . В NNS обычно много настроек. Возможно https://ai.stackexchange.com/questions , вам будет полезно задать вопрос.

2. Если вам интересно, почему ReLu , как правило, лучше, чем sigmoid , stats.stackexchange.com/questions/126238 /…

Ответ №1:

Поскольку вы упомянули единицу скрытого слоя как 2, т.е. Dense(2) Этого недостаточно для обучения модели с учетом ввода массива, имеющего 2 входа. Я включил 16 единиц, вы можете попробовать поэкспериментировать с 32,64 и т. Д. Единицами.

Идеально использовать функцию активации ReLu для скрытого слоя в нейронной сети. (Подробнее об этом см. Комментарий Марка).
Но для этого варианта использования вы можете обойтись без упоминания какой-либо функции активации, но для сходимости к решению требуется больше эпох.

Ниже приведен измененный код, который предсказывает правильный результат с меньшим количеством эпох.

 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.],
              [1., 0.],
              [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.]]