#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.]]