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