2017-04-25 89 views
0

我正在嘗試初學者,使用csv數據。 我從here獲得了csv數據,並將每個標籤製作成一個熱點向量。 每行有794dims(colum1〜10作爲標籤,11〜794作爲像素)。 這裏是我寫的代碼,導致可怕的準確性。張量流中mnist csv數據的準確性不佳

from __future__ import absolute_import 
from __future__ import division 
from __future__ import print_function 
import argparse 
import sys 

import tensorflow as tf 
import numpy  as np 

FLAGS = None 

def main(_): 
    # Import data 
    def csv_to_numpy_array(filepath, delimiter): 
     return np.genfromtxt(filepath,delimiter=delimiter, dtype=None) 

    def import_data(): 
     print("loading training data") 
     traindata = csv_to_numpy_array("data/mnist_train_onehot.csv",delimiter=",") 
     [trainY, trainX] = np.hsplit(traindata,[10]); 
     print("loading test data") 
     [testY, testX] = np.hsplit(testdata,[10]); 
     return trainX, trainY, testX, testY 

    x_train, y_train, x_test, y_test = import_data() 

    numX = x_train.shape[1] #784 
    numY = y_train.shape[1] #10 

    # Prepare the placeholder 
    x = tf.placeholder(tf.float32, [None, numX]) #input box 
    y_ = tf.placeholder(tf.float32, [None, numY]) #output box 

    #define weight and biases 
    w = tf.Variable(tf.zeros([numX,numY])) 
    b = tf.Variable(tf.zeros([numY])) 

    #create the model 
    def model(X, w, b): 
     pyx = tf.nn.softmax(tf.matmul(X, w) + b) 
     return pyx 

    y = model(x, w, b) 

    #cost function 
    loss = -tf.reduce_sum(y_*tf.log(y)) 
    # the loss and acc 
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1])) 
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 
    init = tf.initialize_all_variables() 
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

    sess = tf.InteractiveSession() 
    tf.global_variables_initializer().run() 

    # Train 
    for i in range(1000): 
     ind = np.random.choice(100,100) 
     x_train_batch = x_train[ind] 
     y_train_batch = y_train[ind] 
     #run optimization op (backprop) and cost op (to get loss value) 
     _,c = sess.run([train_step, loss], feed_dict={x: x_train_batch, y_: y_train_batch}) 
     if i % 50 == 0: 
      train_acc = accuracy.eval({x: x_train_batch, y_: y_train_batch}) 
      print('step: %d, acc: %6.3f' % (i, train_acc)) 

    # Test trained model 
    print(sess.run(accuracy, feed_dict={x: x_test, 
             y_: y_test})) 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data', 
         help='Directory for storing input data') 
    FLAGS, unparsed = parser.parse_known_args() 
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) 

準確度爲0.098pt。 有人可以試試這段代碼,告訴我這段代碼有什麼問題嗎? 非常感謝您提前。

+0

嘗試用'TF替換'W = tf.Variable(tf.zeros([numX,numY]))' 。變量(tf.random_normal([numX,numY]))'。你應該嘗試隨機提升你的體重。如果它們全部爲零,則梯度下降可能會卡在初始位置。這可能也是有用的:https://www.youtube.com/watch?v = eBbEDRsCmv4 – niczky12

回答

0

這裏是你所需的更改代碼。具體而言,您可以使用tf.nn.softmax_cross_entropy_with_logits來爲您計算交叉熵。另一個改進是使用loss = tf.reduce_mean ...而不是loss = tf.reduce_sum ... *。這將使你的訓練更正是所有錯誤的平均值,而不是總和。如果你使用總和,你會得到狂野和不受控制的訓練波動,並且你必須使用非常小的梯度下降因子進行補償。如果你發現你必須使用梯度下降高於1或低於.1的東西,你可以通過使用reduce_mean來解決這個問題。

這是你的代碼。

from __future__ import absolute_import 
from __future__ import division 
from __future__ import print_function 
import argparse 
import sys 

import tensorflow as tf 
import numpy  as np 

FLAGS = None 

def main(_): 
    # Import data 
    def csv_to_numpy_array(filepath, delimiter): 
     return np.genfromtxt(filepath,delimiter=delimiter, dtype=None) 

    def import_data(): 
     print("loading training data") 
     traindata = csv_to_numpy_array("data/mnist_train_onehot.csv",delimiter=",") 
     [trainY, trainX] = np.hsplit(traindata,[10]); 
     print("loading test data") 
     [testY, testX] = np.hsplit(testdata,[10]); 
     return trainX, trainY, testX, testY 

    x_train, y_train, x_test, y_test = import_data() 

    numX = x_train.shape[1] #784 
    numY = y_train.shape[1] #10 

    # Prepare the placeholder 
    x = tf.placeholder(tf.float32, [None, numX]) #input box 
    y_ = tf.placeholder(tf.float32, [None, numY]) #output box 

    #define weight and biases 
    w = tf.Variable(tf.zeros([numX,numY])) 
    b = tf.Variable(tf.zeros([numY])) 

    y = tf.matmul(x, w) + b 

    # unused for this model 
    keep_prob = tf.placeholder(tf.float32) 

    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_)) 
    train = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

    # Test trained model 
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) 
    percent_correct = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

    init = tf.initialize_all_variables() 

    sess = tf.InteractiveSession() 
    tf.global_variables_initializer().run() 

    # Train 
    for i in range(1000): 
     ind = np.random.choice(x_train.shape[0],100) 
     x_train_batch = x_train[ind] 
     y_train_batch = y_train[ind] 
     #run optimization op (backprop) and cost op (to get loss value) 
     _,c = sess.run([train_step, loss], feed_dict={x: x_train_batch, y_: y_train_batch}) 
     if i % 50 == 0: 
      train_acc = percent_correct.eval({x: x_train_batch, y_: y_train_batch}) 
      print('step: %d, acc: %6.3f' % (i, train_acc)) 

    # Test trained model 
    print(sess.run(percent_correct, feed_dict={x: x_test, 
             y_: y_test})) 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data', 
         help='Directory for storing input data') 
    FLAGS, unparsed = parser.parse_known_args() 
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) 

下面是幾個不同MNIST tensorflow架構https://github.com/panchishin/learn-to-tensorflow/blob/master/examples/mnist_model_comparison.py所有鏈接在一個腳本

+0

謝謝你的快速回答。 我改變了你提到的損失函數,以及改變Weight和Bias的初始化。 但準確度仍然很低(0.53)。我也會參考鏈接。 – Ted

+0

看線 「ind = np.random.choice(100,100)」 我可以看到你只使用前100個元素進行訓練,但你想使用所有的訓練元素進行訓練。嘗試使用 「ind = np.random.choice(x_train.shape [0],100)」 – Wontonimo

+0

非常感謝。感謝您的幫助,現在我得到了「合理」的結果(0.89pt)。我明白在這種情況下隨機選擇的用法是「random.choice(#alldata,#batchsize)」。 我很高興你幫助過我。再次感謝你。 – Ted

0

有可能出現的問題:

1隨機初始化變量,而不是零

2 - 你可能誤解.csv文件格式,你得到了.csv文件,說格式是label, pix-11, pix-12, pix-13, ...

3-嘗試使用tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits , llabels))您用於計算損失的方法在數值上不穩定。 更新:在這種情況下不使用tf.nn.softmax因爲tf.nn.softmax_cross_entropy_with_logits內部有SOFTMAX正規化和交叉熵(感謝@ ml4294評論)

+0

注意:如果您使用'tf.nn.softmax_cross_entropy_with_logits()',則不應該在您的'softmax()'函數中使用'model()'函數,因爲TensorFlow內置的softmax交叉熵函數需要非標準化的logits。 – ml4294

+0

是的,你的權利。我更新我的答案 –

+0

謝謝你的建議。我嘗試了1和3,然後準確度稍高一些(但仍然很低,0.53pt)。 至於格式,我做了標籤10dims一個熱矢量。 (例如標籤2對應於[0,0,1,0,0,0,0,0,0,0])那麼它不應該是錯的我猜... – Ted