私は、TensorFlow(Python 3版)に完全に接続された簡単なフィードフォワードニューラルネットを実装しようとしています。ネットワークには2つの入力と1つの出力があり、私はそれをトレーニングして2つの入力の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]])}))
それは十分に単純なようだが、最後のprint文は、ニューラルネットは関係なく、トレーニングの繰り返しや学習率の数の、希望出力の近くにどこにもないことを示しています。誰でも私が間違っていることを見ることができますか?
ありがとうございます。
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ではうまく動作しません。私は今非常に困惑しています。
徹底的な答えをありがとうございました。私はあなたが行った変更を理解しています。しかし、OR演算ではなく、XOR演算を実行しようとしています。だから実際には私の目標出力に間違いがなかった。目標出力は[[0.0]、[1.0]、[1.0]、[0.0]]です。あなたのコードを使って、私はまだXORを実行する神経回路網を得ることができません。それについて何か助けてもらえますか? – CircuitScholar
答えを更新しました。 – nessuno
ありがとうございます。私は実際には2つの層だけで目標を達成することができました。ウェイトをゼロ以外の値に初期化するという考えは、私のコードを動作させるものです。 – CircuitScholar