2017-11-22 31 views
0

私は基本的なフィードフォワードニューラルネットワークを約80項目のデータセットで訓練しようとしています(主に概念の証明として、私のデータセットは小さすぎると認識しています)。私はthe MNIST dataset exampleのコードに基づいていました。私は10のバッチサイズを選択しているし、8つの段階でそれを実行しています:このニューラルネットワークの損失は常に0.0で精度は常に1.0ですか?

learning_rate = 0.01 
num_steps = 8 
batch_size = 10 
display_step = 1 

num_input = 16 
n_hidden_1 = 8 
n_hidden_2 = 8 
num_classes = 1 

X = tf.placeholder("float", [None, num_input]) 
Y = tf.placeholder("float", [None, num_classes]) 

weights = { 
    'h1': tf.Variable(tf.random_normal([num_input, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, num_classes])) 
} 
biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden_1])), 
    'b2': tf.Variable(tf.random_normal([n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([num_classes])) 
} 

layer_1 = tf.add(tf.matmul(X, weights['h1']), biases['b1']) 
layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) 
logits = tf.matmul(layer_2, weights['out']) + biases['out'] 

prediction = tf.nn.softmax(logits) 
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) 
train_op = optimizer.minimize(loss_op) 
correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) 
init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    sess.run(init) 
    for step in range(0, num_steps): 
     batch_x, batch_y = manager.import_data() 

     batch_x = batch_x[step * batch_size:(step + 1) * batch_size] 
     batch_y = batch_y[step * batch_size:(step + 1) * batch_size] 

     batch_x = np.reshape(batch_x, (batch_size, num_input)) 
     batch_y = np.reshape(batch_y, (batch_size, num_classes)) 
     sess.run(train_op, feed_dict={X: batch_x, Y: batch_y}) 
     if step % display_step == 0 or step == 1: 
      loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, Y: batch_y}) 
      print("Step " + str(step) + ", Minibatch Loss= " + \ 
        "{:.4f}".format(loss) + ", Training Accuracy= " + \ 
        "{:.3f}".format(acc)) 

manager.import_data()はnumpyの配列のリストを返します。私はバッチの選択をランダム化する必要があることを知っている、と私は最終的にそれを実装します - しかし、出力は次のようになります。

Step 0, Minibatch Loss= 0.0000, Training Accuracy= 1.000 
Step 1, Minibatch Loss= 0.0000, Training Accuracy= 1.000 
Step 2, Minibatch Loss= 0.0000, Training Accuracy= 1.000 
Step 3, Minibatch Loss= 0.0000, Training Accuracy= 1.000 
Step 4, Minibatch Loss= 0.0000, Training Accuracy= 1.000 
Step 5, Minibatch Loss= 0.0000, Training Accuracy= 1.000 
Step 6, Minibatch Loss= 0.0000, Training Accuracy= 1.000 
Step 7, Minibatch Loss= 0.0000, Training Accuracy= 1.000 

もちろん、こうであるべきではありません。私は間違って何をしていますか?

+1

ニューラルネットワークでは、クラスの正と負の例が必要です。したがって、このアルゴリズムは、例えば、車であるかどうかを区別することができる。だから、何が良いか、何が間違っているかを教えるために、より多くのクラスが必要です。 – silgon

答えて

1

トレーニングセットでは、すべてのアイテムが同じラベル(たとえば0)であると思います。

ニューラルネットワークを扱う際の最良の方法は、クラス間でほぼ同じ分布の3つの異なるセット - トレイン、ヴァル、テストを準備することです。トレインはトレーニング時間に使用され、valは各繰り返しの最後に使用され、モデルを保存または無視します。テストはモデルのリアリティチェックのようなもので、テストの得点に基づいてパラメータを調整しないでください。

+0

これはそうだった - 私のサンプル出力はほとんどすべて同じでした。ありがとう! – KingBob

関連する問題