2016-10-20 6 views
2

Копирование и вставка кода с MNIST tutorial от tensorflow работает очень хорошо, в результате получается точность 92%, как и ожидалось.Tensorflow feed_dict не изучается

Когда я считываю данные MNIST в формате CSV и конвертирую в np-массив, используя pd.DataFrame.values, этот процесс прерывается. Я получаю точность от 10% (не лучше, чем случайную).

Ниже приведен код (обучающий код работает хорошо, мой читатель CSV не сможет узнать):

Рабочей MNIST учебника:

from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 


x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.nn.softmax(tf.matmul(x, W) + b) 
y_ = tf.placeholder(tf.float32, [None, 10]) 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

for i in range(1000): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 


correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) 

Не работает (чтение CSV и подача нп массив):

import pandas as pd 
from sklearn.cross_validation import train_test_split 
import numpy as np  

# read csv file 
MNIST = pd.read_csv("/data.csv") 

# pop label column and create training label array 
train_label = MNIST.pop("label") 

# converts from dataframe to np array 
MNIST=MNIST.values 

# convert train labels to one hots 
train_labels = pd.get_dummies(train_label) 
# make np array 
train_labels = train_labels.values 

x_train,x_test,y_train,y_test = train_test_split(MNIST,train_labels,test_size=0.2) 
# we now have features (x_train) and y values, separated into test and train 

# convert to dtype float 32 
x_train,x_test,y_train,y_test = np.array(x_train,dtype='float32'), np.array(x_test,dtype='float32'),np.array(y_train,dtype='float32'),np.array(y_test,dtype='float32') 



x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.nn.softmax(tf.matmul(x, W) + b) 
y_ = tf.placeholder(tf.float32, [None, 10]) 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

def get_mini_batch(x,y): 
    # choose 100 random row values 
    rows=np.random.choice(x.shape[0], 100) 
    # return arrays of 100 random rows (for features and labels) 
    return x[rows], y[rows] 

# train 
for i in range(100): 
    # get mini batch 
    a,b=get_mini_batch(x_train,y_train) 
    # run train step, feeding arrays of 100 rows each time 
    sess.run(train_step, feed_dict={x: a, y_: b}) 

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
print(sess.run(accuracy, feed_dict={x: x_test, y_: y_test})) 

Справка была бы принята с благодарностью. (Файл CSV here.)

ответ

0

Пробовал ли вы его тренировать для большего количества итераций? Я вижу, что исходный код является обучение более 1000 итераций

for i in range(1000): 

В то время как код CSV тренирует только для 100 итераций:

for i in range(100): 

Если это не причина, это было бы полезно, если бы вы могли бы также доля ваш CSV-файл, чем мы можем легко протестировать ваш код.

Edit:

Я проверил ваш код и он, вероятно, вызвано численными неустойчивостей в простом cross_entropy расчета (см это SO question). Замена вашего cross_entropy определения в следующей строке, вы сможете решить эту проблему:

cross_entropy = tf.reduce_mean(tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(
    y, y_, name='xentropy'))) 

К также визуализируя возвращаемый cross_entropy, вы увидите, что ваш код возвращает NaN, в то время как с помощью этого кода вы получите реальные цифры. ..

Полный рабочий код, который также выводит cross_entropy за итерацию:

import pandas as pd 
from sklearn.cross_validation import train_test_split 
import numpy as np  

# read csv file 
MNIST = pd.read_csv("data.csv") 

# pop label column and create training label array 
train_label = MNIST.pop("label") 

# converts from dataframe to np array 
MNIST=MNIST.values 

# convert train labels to one hots 
train_labels = pd.get_dummies(train_label) 
# make np array 
train_labels = train_labels.values 

x_train,x_test,y_train,y_test = train_test_split(MNIST,train_labels,test_size=0.2) 
# we now have features (x_train) and y values, separated into test and train 

# convert to dtype float 32 
x_train,x_test,y_train,y_test = np.array(x_train,dtype='float32'), np.array(x_test,dtype='float32'),np.array(y_train,dtype='float32'),np.array(y_test,dtype='float32') 

x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.nn.softmax(tf.matmul(x, W) + b) 
y_ = tf.placeholder(tf.float32, [None, 10]) 
print y.get_shape() 
print y_.get_shape() 
cross_entropy = tf.reduce_mean(tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(y, y_, name='xentropy'))) 
train_step = tf.train.GradientDescentOptimizer(0.0001).minimize(cross_entropy) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

def get_mini_batch(x,y): 
    # choose 100 random row values 
    rows=np.random.choice(x.shape[0], 100) 
    # return arrays of 100 random rows (for features and labels) 
    return x[rows], y[rows] 

# train 
for i in range(1000): 
    # get mini batch 
    a,b=get_mini_batch(x_train,y_train) 
    # run train step, feeding arrays of 100 rows each time 
    _, cost =sess.run([train_step,cross_entropy], feed_dict={x: a, y_: b}) 
    print cost 

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
print(sess.run(accuracy, feed_dict={x: x_test, y_: y_test})) 

Вам все еще нужно оптимизировать скорость обучения и #iterations далее, но с помощью этой установки вы уже должны GE t ~ 70% точности.

+1

CSV link загружен. И, увы, нет ... 1000 тренировочных взаимодействий приведут к 10% -ной точности с моим кодом. –

+0

Когда я запускаю это, точность уменьшается. Могу ли я спросить, какую точность вы получаете с этой новой cross_entropy? –

+0

Извините, у меня был неправильный знак минуса в коде, теперь у меня точность 73%, я поместил свой полный код в текст! Обратите внимание, что вы можете играть с частотой обучения и количеством итераций для повышения точности. – Fematich

0

Я уверен, что партии не должны быть 100 случайных строк, но должны быть 100 строк, которые приходят друг за другом, например, 0:99 и 100: 199 будут вашими первыми двумя партиями. Попробуйте этот код для партий. Проверьте это kernel out для обучения Mnist from csv in TF

epochs_completed = 0 
index_in_epoch = 0 
num_examples = train_images.shape[0] 

# serve data by batches 
def next_batch(batch_size): 

    global train_images 
    global train_labels 
    global index_in_epoch 
    global epochs_completed 

    start = index_in_epoch 
    index_in_epoch += batch_size 

    # when all trainig data have been already used, it is reorder randomly  
    if index_in_epoch > num_examples: 
     # finished epoch 
     epochs_completed += 1 
     # shuffle the data 
     perm = np.arange(num_examples) 
     np.random.shuffle(perm) 
     train_images = train_images[perm] 
     train_labels = train_labels[perm] 
     # start next epoch 
     start = 0 
     index_in_epoch = batch_size 
     assert batch_size <= num_examples 
    end = index_in_epoch 
    return train_images[start:end], train_labels[start:end] 
Смежные вопросы