3

Я пытаюсь использовать Tensorflow, чтобы оценить его пригодность для классификации данных, которые я изучаю в проекте Huntington Disease (не относящийся к проблеме, просто предоставляющий контекст). Раньше я использовал Машины поддержки поддержки для классификации моих данных, которые были «хорошо». Я надеюсь, что NNetworks лучше.Точность остается идентичной между прогонами Tensorflow

Загрузка данных в порядке, никаких проблем нет. Прочитав документацию по Tensorflow и следуя некоторым учебникам и примерам в Интернете, я написал следующее, чтобы сделать очень простой пример сети с данными CSV. Данные, которые я использую в этом примере, представляют собой стандартную базу данных изображений MNIST, но в формате CSV.

datafile = os.path.join('/pathtofile/','mnist_train.csv') 
    descfile = os.path.join('/pathtofile/','mnist_train.rst') 
    mnist = DataLoader(datafile, descfile).load_model() 

    x_train, x_test, y_train, y_test = train_test_split(mnist.DATA, mnist.TARGET, test_size=0.33, random_state=42) 

    ## Width and length of arrays 
    train_width = len(a_train[0]) + 1; train_length = len(a_train) 
    test_width = len(a_test[0]) + 1; test_length = len(a_test) 
    data = self.build_rawdata(a_train, b_train, train_length, train_width) 
    test_data = self.build_rawdata(a_test, b_test, test_length, test_width) 

    y_train, y_train_onehot = self.onehot_converter(data) 
    y_test, y_test_onehot = self.onehot_converter(test_data) 

    ## A = Features, B = Classes 
    A = data.shape[1]-1 
    B = len(y_train_onehot[0]) 

Все функциональные. Поездные, тестовые и однократные массивы имеют правильный размер и заполняются правильными значениями.

Фактический код тензорного потока, где я, скорее всего, ошибаюсь (?).

sess = tf.InteractiveSession() 

    ##Weights and bias 
    x = tf.placeholder("float", shape=[None, A]) 
    y_ = tf.placeholder("float", shape=[None, B]) 
    W = tf.Variable(tf.random_normal([A,B], stddev=0.01)) 
    b = tf.Variable(tf.random_normal([B], stddev=0.01)) 

    sess.run(tf.initialize_all_variables()) 
    y = tf.nn.softmax(tf.matmul(x, W) + b) 
    cross_entropy = -tf.reduce_sum(y_*tf.log(y)) 

    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 

    ## 300 iterations of learning 
    ## of the above GradientDescentOptimiser 
    for i in range(100): 
     train_step.run(feed_dict={x: x_train, y_: y_train_onehot}) 
     correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 
     result = sess.run(accuracy, feed_dict={x: x_test, y_: y_test_onehot}) 
     print 'Run {}, {}'.format(i+1, result) 

Каждый выход этого кода всегда производит точно такую ​​же точность, и я не могу понять, почему.

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 12 
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 12 
Run 1, 0.0974242389202 
Run 2, 0.0974242389202 
Run 3, 0.0974242389202 
Run 4, 0.0974242389202 
Run 5, 0.0974242389202 
Run 6, 0.0974242389202 
Run 7, 0.0974242389202 
Run 8, 0.0974242389202 
Run 9, 0.0974242389202 
Run 10, 0.0974242389202 
.... 
Run 100, 0.0974242389202 

Я вернулся и посмотрел учебники и примеры, которые я изучил. Набор данных диафрагмы (загруженный таким же образом) дал правильный результат, который точно предсказал. Тем не менее, этот код с данными MNIST CSV не работает.

Любое понимание будет оценено по достоинству.

EDIT 1:

Так у меня было несколько минут и попробовал некоторые из ваших предложений, но безрезультатно. Я также решил вернуться и проверить вещи с помощью набора данных Iris CSV для сравнения. Выход немного отличается после использования sess.run (train_step, корма = Dict = {...}:

Run 1, 0.300000011921 
Run 2, 0.319999992847 
Run 3, 0.699999988079 
Run 4, 0.699999988079 
Run 5, 0.699999988079 
Run 6, 0.699999988079 
Run 7, 0.360000014305 
Run 8, 0.699999988079 
Run 9, 0.699999988079 
Run 10, 0.699999988079 
Run 11, 0.699999988079 
Run 12, 0.699999988079 
Run 13, 0.699999988079 
Run 14, 0.699999988079 
Run 15, 0.699999988079 
Run 16, 0.300000011921 
Run 17, 0.759999990463 
Run 18, 0.680000007153 
Run 19, 0.819999992847 
Run 20, 0.680000007153 
Run 21, 0.680000007153 
Run 22, 0.839999973774 
Run 23, 0.319999992847 
Run 24, 0.699999988079 
Run 25, 0.699999988079 

Значения обычно парят вокруг этого диапазона, пока он не достигнет Run 64, где она заперта на:

Run 64, 0.379999995232 
... 
Run 100, 0.379999995232 
+0

как быстро вещь, попробуйте сделать СЭСС .run (train_step, ...) - это, вероятно, не p roblem, но он выпрыгивает из-за того, что вы не делали «с сеансом» – dga

+0

Все ли ваши значения y_ 0, если это возможно? Это создало бы градиентный нуль и оставил бы ваш вектор параметров без изменений между итерациями. Вы можете отлаживать, добавляя инструкции tf.Print для печати промежуточных значений в вашем вычислительном графе –

+0

Спасибо за ваш вклад, я рассмотрю эти параметры, когда у меня будет время вне встреч (лоты сегодня, zzz) – amaxwell

ответ

0

Я думаю, что проблема может быть, что ваш train_step не внутри sess.run попробовать это также рассмотреть возможность использования мини-пакетирование для обучения, как так:.

for i in range(100): 
    for start, end in zip(range(0, len(x_train), 20), range(20, len(x_train), 20)): 
     sess.run(train_step, feed_dict={x: x_train[start:end], y_: y_train_onehot[start:end]}) 
+0

, но есть train_step.run, который вызывает вызовите session.run (train_step), используя сеанс по умолчанию, который в этом случае будет нужен. –

+0

Да, похоже, это ничего не меняет. Тот же выход. Я буду продолжать работать, когда я получу некоторое время. – amaxwell

+0

Np, подумал, стоит попробовать, особенно мини-пакет, так как это объяснит несколько диких прыжков, я посмотрю, смогу ли я придумать что-нибудь еще. –

Смежные вопросы