2017-06-29 10 views
0

A-Jのグレイスケール28 * 28アルファベットを含むnotMNISTデータセットのネットを書きました。高精度でも間違った多様な答えを与えるニューラルネット

このモデルでは、テストデータセットで89%の精度が得られますが、列車データセットから個々の画像の結果をチェックすると(カスタム画像について話していなくても)間違った結果が得られます。同じコードブロックを繰り返し実行すると、結果は1つの出力で異なります。

私はここで本当に間違ったことをしているに違いないが、私は深く学び始めている。

マイモデル - >

batch_size = 128 
#tensorflow datasets 
tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size*image_size)) 
tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) 
tf_valid_dataset = tf.constant(valid_dataset) 
tf_test_dataset = tf.constant(test_dataset) 
#weights and biases for layer 1 
weights_l1 = tf.Variable(
    tf.truncated_normal([image_size*image_size, 1024]) 
) 
biases_l1 = tf.Variable(
    tf.zeros([1024]) 
) 
#output layer weights and biases 
weights = tf.Variable(
    tf.truncated_normal([1024, num_labels]) 
) 
biases = tf.Variable(
    tf.zeros([num_labels]) 
) 

hl1 = tf.matmul(tf_train_dataset, weights_l1) + biases_l1 
hl1 = tf.nn.relu(hl1) 

logits = tf.matmul(hl1, weights) + biases 

loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels, logits=logits) 
) 


optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss) 

#validation predictions 
v_hl1 = tf.matmul(tf_valid_dataset, weights_l1) + biases_l1 
v_hl1 = tf.nn.relu(v_hl1) 
v_logits = tf.matmul(v_hl1, weights) + biases 
#test predictions 
t_hl1 = tf.matmul(tf_test_dataset, weights_l1) + biases_l1 
t_hl1 = tf.nn.relu(t_hl1) 
t_logits = tf.matmul(t_hl1, weights) + biases 

train_prediction = tf.nn.softmax(logits) 
valid_prediction = tf.nn.softmax(v_logits) 
test_prediction = tf.nn.softmax(t_logits) 

トレーニング工程 - >

num_steps = 3001 

with tf.Session() as session: 
    tf.global_variables_initializer().run() 
    for step in range(num_steps): 
     offset = (step*batch_size) % (train_labels.shape[0]-batch_size) 
     feed_dict = {tf_train_dataset: train_dataset[offset: offset+batch_size, :], 
        tf_train_labels: train_labels[offset: offset+batch_size, :] 
        } 
     _, l, predictions = session.run([optimizer, loss, train_prediction], feed_dict=feed_dict) 
     if(step%500 == 0): 
      print ('minibatch no.', step) 
      print ('current loss', l) 
      print("Minibatch accuracy: %.1f%%" % accuracy(predictions, train_labels[offset: offset+batch_size, :])) 
      print("Validation accuracy: %.1f%%" % accuracy(valid_prediction.eval(), valid_labels)) 
    print("Test accuracy: %.1f%%" % accuracy(test_prediction.eval(), test_labels)) 

出力 - >

minibatchありません。 0 電流損失351.531 ミニバッチ精度:7.8% 検証精度:27.7% minibatch no。 500 電流損失6.78443 最小精度:82.0% 検証精度:81.9% minibatch no。 1000 電流損失6.5816 最小精度:80.5% 検証精度:81.9% minibatch no。 1500 電流損失4.70451 最小精度:81.2% 検証精度:82.4% minibatch no。 2000 電流損失3.25759 最小精度:84.4% 検証精度:79.1% minibatch no。 2500 現在の損失4.18851 ミニバッチ精度:82.8% 検証精度:81.6% minibatch no。 3000 電流損失2.84338 Minibatch精度:86.7パーセント 検証精度:83.0パーセント 試験精度:89.0パーセント

テスト>

イメージ - のための(画像が 'F' であると言うことができます)

あなたはランダムな値にネットワークを再初期化してから画像入力のために解決しようと、このコードで
image_file = 'EE.png' 
image_data = (ndimage.imread(image_file).astype(float) - 
        pixel_depth/2)/pixel_depth 
new_image_data = image_data.reshape([1, 784]) 
new_image_data = tf.convert_to_tensor(new_image_data) 
new_image_data = tf.cast(new_image_data, dtype=tf.float32) 
answer = tf.matmul(new_image_data, weights_l1) + biases_l1 
answer = tf.nn.relu(answer) 
answer = tf.matmul(answer, weights) + biases 
answer = tf.nn.softmax(answer) 
with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    print(sess.run(answer)) 

おかげ

答えて

1

with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    print(sess.run(answer)) 

次のコードは、あなたが欲しいの出力を生成します。

logits.eval(feed_dict={tf_train_dataset:answer}) 

あなたがテストと検証セットに計算のための変数を再利用することができます。新しいテンソルを使う必要はありません。異なる変数を使用する場合は、同じ変数にアクセスする必要があります。基本的な概念を理解するために、テンソルフローホームページで提供される標準的なMNISTチュートリアルを行うことをお勧めします。

これらの概念を理解する必要がない場合は、テンソルフローのラッパーであるケラス(https://keras.io/)を指摘できますが、この複雑さは避けられます。

+0

ありがとうございますが、まだコードを実行できません。 feed_dictもtf_train_labelsに何らかの値を与える必要がありますか? –

+0

また、どうしてlogitsに.eval()を適用していますか? train_predictionsに適用すべきではありませんか? –

+0

logitsは学習された関数を記述するためです。ロジットのクロスエントロピーによって得られた損失をラベルに最適化することによって、関数が学習され、この関数を評価することによって所望の出力が得られます –

関連する問題