Я пытаюсь реализовать простую полностью подключенную нейронную сеть с прямой связью в TensorFlow (версия Python 3). Сеть имеет 2 входа и 1 выход, и я пытаюсь подготовить его для вывода XOR двух входов. Мой код выглядит следующим образом:TensorFlow: 2-слойная прямая нейронная сеть
import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
inputs = tf.placeholder(tf.float32, shape = [None, 2])
desired_outputs = tf.placeholder(tf.float32, shape = [None, 1])
weights_1 = tf.Variable(tf.zeros([2, 3]))
biases_1 = tf.Variable(tf.zeros([1, 3]))
layer_1_outputs = tf.nn.sigmoid(tf.matmul(inputs, weights_1) + biases_1)
weights_2 = tf.Variable(tf.zeros([3, 1]))
biases_2 = tf.Variable(tf.zeros([1, 1]))
layer_2_outputs = tf.nn.sigmoid(tf.matmul(layer_1_outputs, weights_2) + biases_2)
error_function = -tf.reduce_sum(desired_outputs * tf.log(layer_2_outputs))
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(error_function)
sess.run(tf.initialize_all_variables())
training_inputs = [[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]]
training_outputs = [[0.0], [1.0], [1.0], [0.0]]
for i in range(10000):
train_step.run(feed_dict = {inputs: np.array(training_inputs), desired_outputs: np.array(training_outputs)})
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[0.0, 0.0]])}))
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[0.0, 1.0]])}))
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[1.0, 0.0]])}))
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[1.0, 1.0]])}))
Это кажется достаточно простым, но операторы печати в конце показывают, что нейронная сеть далеко не желаемых результатов, независимо от количества учебных итераций или скорости обучения. Может ли кто-нибудь увидеть, что я делаю неправильно?
спасибо.
EDIT: Я также попытался следующую альтернативную функцию ошибки:
error_function = 0.5 * tf.reduce_sum(tf.sub(layer_2_outputs, desired_outputs) * tf.sub(layer_2_outputs, desired_outputs))
Эта функция ошибки представляет собой сумму квадратов ошибок. Он ВСЕГДА приводит к тому, что сеть выводит значение ровно 0,5 - еще одно указание на ошибку где-то в моем коде.
EDIT 2: Я обнаружил, что мой код отлично работает для AND и OR, но не для XOR. Я сейчас очень озадачен.
Большое спасибо за подробный ответ. Я понимаю изменения, которые вы внесли. Тем не менее, я пытаюсь выполнить операцию XOR, а не операцию OR. Таким образом, на моих целевых выходах не было ошибок. целевые выходы - [[0.0], [1.0], [1.0], [0.0]]. Используя ваш код, я все еще не могу заставить нейронную сеть выполнять XOR. Можете ли вы предложить какую-либо помощь в этом отношении? – CircuitScholar
Я обновил свой ответ. – nessuno
Спасибо. Я действительно смог достичь цели только с двумя слоями. Ваша идея инициализации весов для ненулевых значений - это то, что заставило мой код работать. – CircuitScholar