Я написав простий MLP в TensorFlow, який моделює XOR-ворота .
Отже для:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
він повинен виробляти наступне:
output_data = [[0.], [1.], [1.], [0.]]
Мережа має вхідний шар, прихований шар та вихідний шар з 2, 5 та 1 нейроном кожен.
В даний час у мене є така перехресна ентропія:
cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))
Я також спробував цю простішу альтернативу:
cross_entropy = tf.square(n_output - output)
поряд з деякими іншими спробами.
Однак, незалежно від того, якою була настройка, помилка з a GradientDescentOptimizer
зменшувалася набагато повільніше, ніж an AdamOptimizer
.
Насправді отримали tf.train.AdamOptimizer(0.01)
справді хороші результати після 400-800 кроків навчання (залежно від рівня навчання, де 0.01
були найкращі результати), хоча tf.train.GradientDescentOptimizer
завжди було потрібно понад 2000 кроків навчання, незалежно від того, який перехресний ентропійний розрахунок або рівень навчання використовувався.
Чому це так? Здається AdamOptimizer
, завжди кращий вибір ?!