2017-12-01 18 views
1

私は、CSV入力を使用してTensorflowでMNISTイメージ分類を実装しようとしています。精度は約10%と非常に低いです。私は3つの完全に接続されたレイヤーをsoftmaxエントロピーで出力に使用しています。私は、CSVファイルを使用しようとしたTensorflow MNIST with csv:low accuracy

import tensorflow as tf 
import numpy as np 
import pandas as pd 

trainimages=pd.read_csv("train-images.csv",header=None,delimiter=',').values 
trainlabels=pd.read_csv("train-labels.csv",header=None,delimiter=',').values 

testimages=pd.read_csv("t10k-images.csv",header=None,delimiter=',').values 
testlabels=pd.read_csv("t10k-labels.csv",header=None,delimiter=',').values 

label_ph=tf.placeholder(tf.int64,shape=(None,1)) 
reshapeval=tf.Variable(100) 
onehotencoding=tf.one_hot(label_ph,depth=10) 
datalabels=tf.reshape(onehotencoding,shape=(reshapeval,10)) 

with tf.Session() as sess: 
    onehottrainlabels=sess.run(datalabels,feed_dict={label_ph:trainlabels,reshapeval:trainlabels.shape[0]}) 
    onehottestlabels=sess.run(datalabels,feed_dict={label_ph:testlabels,reshapeval:testlabels.shape[0]}) 
    print("datalabels:",onehottrainlabels) 
    print("datalabels:",onehottestlabels) 
    #sess.run(datalabels) 

np.savetxt("mnist_train_labels_onehot.csv",onehottrainlabels,delimiter=',') 
np.savetxt("mnist_test_labels_onehot.csv",onehottestlabels,delimiter=',') 

:私は以下のコードを使用して、入力として使用するCSVファイルにhereからmnistデータセットを変換する:以下のように

import idx2numpy 
import numpy as np 
# Reading 
filename = 'train-images' 
flext1 = '.idx3-ubyte' 
flext2 = '.csv' 
ndarr = idx2numpy.convert_from_file(filename+flext1).reshape(60000, 784) 
np.savetxt(filename,ndarr,delimiter=',') 

そしてIはワンホットラベルをコード

import tensorflow as tf 
import pandas as pd 
import numpy as np 

trainimages=pd.read_csv("train-images.csv",header=None,delimiter=',').values 
trainlabels=pd.read_csv("mnist_train_labels_onehot.csv",header=None,delimiter=',').values 
testimages=pd.read_csv("t10k-images.csv",header=None,delimiter=',').values 
testlabels=pd.read_csv("mnist_test_labels_onehot.csv",header=None,delimiter=',').values 
#%% 
train_num=len(trainimages) 
n_epochs=400 
BATCH_SIZE = 50 
N_FEATURES = 785 
n_inputs =28*28 
n_hidden1=300 
n_hidden2=100 
n_outputs = 10 
learning_rate=0.01 
X=tf.placeholder(tf.float32,shape=(None,n_inputs),name='X') 
y=tf.placeholder(tf.int64,shape=(None,10),name='y') 
print("stage1") 

with tf.name_scope("dnn"): 
    hidden1=tf.contrib.layers.fully_connected(X,n_hidden1,scope="hidden1") 
    hidden2=tf.contrib.layers.fully_connected(hidden1,n_hidden2,scope="hidden2") 
    logits=tf.contrib.layers.fully_connected(hidden2,n_outputs,scope="outputs",activation_fn=None) 
with tf.name_scope("loss"): 
    xentropy =tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits) 
    loss =tf.reduce_mean(xentropy,name="loss") 
    loss_summary=tf.summary.scalar("log_loss",loss) 
with tf.name_scope("train"): 
    optimizer=tf.train.GradientDescentOptimizer(learning_rate) 
    training_op=optimizer.minimize(loss) 
with tf.name_scope("eval"): 
    correct=tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))#tf.nn.in_top_k(logits,y,1) 
    accuracy=tf.reduce_mean(tf.cast(correct,tf.float32)) 

init =tf.global_variables_initializer() 
saver =tf.train.Saver() 
print("stage 2") 

with tf.Session() as sess: 
    sess.run(init) 
    print("stage 3") 
    for epoch in range(n_epochs): 
    #print("stage 4") 
    for iteration in range(train_num//BATCH_SIZE): 
     #print("stage 5") 
     ind = np.random.choice(trainimages.shape[0],BATCH_SIZE) 
     x_train_batch = trainimages[ind] 
     y_train_batch = trainlabels[ind] 
     sess.run(training_op,feed_dict={X:x_train_batch,y:y_train_batch}) 
     #print("stage 6") 
    if epoch%20==0: 
     #print(x_train_batch, y_train_batch) 
     acc_train=sess.run(accuracy,feed_dict={X:x_train_batch,y:y_train_batch}) 
     acc_test=sess.run(accuracy,feed_dict={X:testimages,y:testlabels}) 

     print(epoch, "Train accuracy:", acc_train,"Test accuracy:",acc_test) 

出力精度は約0.15まで向上しません。私がここで間違っていることについて誰かが助言できるなら、私は本当に感謝します。

参考のために、上のグラフの構成は、Hands-on Tensorflowで学習する実例に基づいています。以下は98%の精度を生成する元のコードです。もちろん、私はcsv入力を受け入れるためにコードを少し修正しました。

import tensorflow as tf 
import numpy as np 
import pandas as pd 
import random 
from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets("/tmp/data/") 


#%% 
tf.reset_default_graph() 
print("I reset graph") 
n_inputs =28*28 
n_hidden1=300 
n_hidden2=100 
n_outputs = 10 
learning_rate=0.01 
X=tf.placeholder(tf.float32,shape=(None,n_inputs),name='X') 
y=tf.placeholder(tf.int64,shape=(None),name='y')      



with tf.name_scope("dnn"): 
    hidden1=tf.layers.dense(X,n_hidden1,name="hidden1",activation=tf.nn.relu) 
    hidden2=tf.layers.dense(hidden1,n_hidden2,name="hidden2",activation=tf.nn.relu) 
    logits=tf.layers.dense(hidden2,n_outputs,name="outputs") 
with tf.name_scope("loss"): 
    xentropy =tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits=logits) 
    loss =tf.reduce_mean(xentropy,name="loss") 
    #loss_summary=tf.summary.scalar("log_loss",loss) 
with tf.name_scope("train"): 
    optimizer=tf.train.GradientDescentOptimizer(learning_rate) 
    training_op=optimizer.minimize(loss) 
with tf.name_scope("eval"): 
    correct=tf.nn.in_top_k(logits,y,1) 
    accuracy=tf.reduce_mean(tf.cast(correct,tf.float32)) 

init =tf.global_variables_initializer() 
saver =tf.train.Saver() 

#============================================================================== 
# from tensorflow.examples.tutorials.mnist import input_data 
# mnist=input_data.read_data_sets("/tmp/data/") 
#============================================================================== 

n_epochs=400 
batch_size=100 
print("graph construction over i start train and test") 
with tf.Session() as sess: 
    sess.run(init) 
    for epoch in range(n_epochs): 
     for iteration in range(mnist.train.num_examples//batch_size): 
      X_batch, y_batch = mnist.train.next_batch(batch_size) 

      #print(X_batch, y_batch) 
      sess.run(training_op,feed_dict={X:X_batch,y:y_batch}) 
     print("iteration over") 
     if epoch%5==0: 
      acc_train=sess.run(accuracy,feed_dict={X:X_batch,y:y_batch}) 
      acc_test=sess.run(accuracy,feed_dict={X: mnist.validation.images, y: mnist.validation.labels}) 
      print(epoch, "Train accuracy:", acc_train,"Test accuracy:",acc_test) 
    save_path=saver.save(sess,"./my_model_final.ckpt") 

追加情報: 私は、バッチサイズを縮小した後、繰り返しの数のためのニューラルネットワークの出力logitsをプリントアウトします。出力は10回程度の反復後に飽和するようです。私はAdamOptimizerにオプティマイザを変更しようとしましたが、それでも精度は向上しません。以下にlogits出力のサンプルを示します。

iteration 7 
Y_train: [[0 1 0 0 0 0 0 0 0 0] 
[0 1 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 1 0]] 
Logits: [[ 2.26569266e+17 3.05248736e+22 -2.50115512e+23 -4.39891557e+14 
    1.11553920e+23 3.07485097e+14 2.20944474e+17 4.47584162e+13 
    1.08036284e+23 4.83180834e+14] 
[ 3.86803140e+17 8.75195504e+22 -7.17081147e+23 -2.68349530e+15 
    3.19824929e+23 8.67874780e+14 3.76970654e+17 4.52455091e+13 
    3.09735965e+23 3.87887019e+14] 
[ 2.38161056e+17 3.84007123e+22 -3.14640962e+23 -6.05196997e+14 
    1.40332858e+23 3.16957379e+14 2.32241818e+17 4.01556080e+13 
    1.35906927e+23 4.00997575e+14]] 
Softmax_out: [ 8.10290437e+22 2.32305379e+23 4.42593055e+21] 
Accuracy: [False False False] 


iteration 8 
Y_train: [[1 0 0 0 0 0 0 0 0 0] 
[0 1 0 0 0 0 0 0 0 0] 
[0 0 0 1 0 0 0 0 0 0]] 
Logits: [[    inf    inf 1.66566635e+35    inf 
       -inf 1.03125672e+30 1.62685693e+35 6.78127837e+30 
    -4.95936289e+35 4.14895906e+30] 
[ 1.38760797e+38 1.10565560e+38 3.23025301e+34 2.54545823e+38 
       -inf 1.99993203e+29 3.15498898e+34 1.31510396e+30 
    -9.61777107e+34 8.04613877e+29] 
[    inf    inf 2.54806070e+35    inf 
       -inf 1.57756931e+30 2.48869187e+35 1.03736909e+31 
    -7.58660917e+35 6.34688775e+30]] 
Softmax_out: [ nan nan nan] 
Accuracy: [ True False False] 


iteration 9 
Y_train: [[0 0 0 0 0 1 0 0 0 0] 
[0 1 0 0 0 0 0 0 0 0] 
[0 0 1 0 0 0 0 0 0 0]] 
Logits: [[ nan nan nan nan nan nan nan nan nan nan] 
[ nan nan nan nan nan nan nan nan nan nan] 
[ nan nan nan nan nan nan nan nan nan nan]] 
Softmax_out: [ nan nan nan] 
Accuracy: [False False False] 
+0

学習率を下げてみましたか?あなたのモデルが無限/ナンを示している場合は、ハイパーパラメータを微調整する必要があります。 –

答えて

0

10カテゴリの問題で10%の精度はランダムな出力です。私の推測では、reshapeへのあなたの呼び出しがあなたの入力を争っているということです。私はそれを転置てるよう

import tensorflow as tf 

initial = tf.constant([[1, 2, 3, 4],[5, 6, 7, 8]]) 
reshaped = tf.reshape(initial, [4, 2]) 

with tf.Session() as sess: 
    init = tf.global_variables_initializer() 
    sess.run(init) 

    print(sess.run(initial)) 
    print(sess.run(reshaped)) 

私はそれが聞こえる4x2のテンソル、に2x4のテンソルを回すんだけど、実際には出力が

[[1 2 3 4] 
[5 6 7 8]] 
[[1 2] 
[3 4] 
[5 6] 
[7 8]] 
次のとおりです。たとえば、次のコードを検討

matplotlibを使用していくつかの例を表示して、数字のように見えるかどうかを確認することをお勧めします。ラベルを出力して、まだ一致していることを確認することも良い考えです。

+0

あなたが話しているコードを実行した後、ワンホットラベルをチェックしました。期待された成果でした。答える時間をとっていただきありがとうございますが、 'tf.reshape'は問題ではありません。 – Kanmani

+0

しかし、入力画像を視覚化して意味があることを確認しましたか? –

0

私は次のようにレイヤーを構築すべきだと思います。

32の入力機能+ relu +ドロップアウト28 32入力機能を備えた入力+ relu +ドロップアウト(0.2)

の会話+ relu +ドロップアウト(0.2)

の会話(0.2)

との会話

平坦化()

高密度又は128出力dendriesと完全に接続512 dendries +ドロップアウト(0.5)と

高密度又は完全接続層softmax機能付き

私は独自のmnistタイプのデータセットを使用して99.7%の精度を達成しました。

チェックこのアウト:Text Classification using Keras

注:私は36回のクラスを持っていました。 10桁と26文字のアルファベット

関連する問題