2017-12-01 19 views
1

CSV 입력을 사용하여 Tensorflow에서 MNIST 이미지 분류를 구현하려고합니다. 정확도는 약 10 %로 매우 낮습니다. 출력에서 소프트 맥스 엔트로피가있는 3 개의 완전히 연결된 레이어를 사용하고 있습니다.csv를 사용하는 Tensorflow MNIST : 낮은 정확도

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 파일을 사용하려고 :

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=',') 

그럼 내가 한 핫 아래로 레이블을 인코딩 : 나는 아래의 코드를 사용하여 입력으로 사용하는 CSV로 here에서 mnist 데이터 세트를 변환 아래 그림과 같이 이미지 분류 모델을 시도하고 훈련하기 위해 위에 표시된대로 생성됩니다.

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

학습 속도를 낮추시겠습니까? 모델에 무한/nans가 표시되면 하이퍼 매개 변수를 조정해야 할 수 있습니다. –

답변

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)) 

나는 그것이 소리를 만드는 × 2 텐서,에 2 × 4 텐서를 돌리겠다 있지만, 사실은 출력

[[1 2 3 4] 
[5 6 7 8]] 
[[1 2] 
[3 4] 
[5 6] 
[7 8]] 
입니다 : 예를 들어, 다음 코드를 고려

matplotlib를 사용하여 몇 가지 예제를 표시하여 여전히 숫자처럼 보이는지 확인하는 것이 좋습니다. 또한 레이블을 출력하여 여전히 일치하는지 확인하는 것이 좋습니다.

+0

당신이 말하는 코드를 실행 한 후 원 핫 라벨을 확인했습니다. 그것은 예상 된 결과입니다. 시간을내어 주셔서 감사합니다.하지만'tf.reshape '는 문제가 아닙니다. – Kanmani

+0

하지만 입력 이미지를 시각화하여 의미가 있는지 확인하려고 했습니까? –

0

다음과 같이 레이어를 만들어야한다고 생각합니다. 28 입력 + relu + 결락 (0.2)

야그와

야그 32 개 입력 기능 + relu + 결락 (0.2)

야그 32 개 입력 기능 + relu + 강하 (0.2)

펼치기()

512 dendries + 강하 (0.5)와

밀도 또는 완전히 연결 층

밀도 또는 완전히 (128)의 출력에 연결 dendries softmax 기능 사용

내 자신의 데이터 형식을 사용하여 99.7 %의 정확도를 달성했습니다.

확인이 아웃 : Text Classification using Keras

참고 : 나는 36 개 수업을했다. 10 자리 및 26 자 알파벳