Я пытаюсь использовать 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
как быстро вещь, попробуйте сделать СЭСС .run (train_step, ...) - это, вероятно, не p roblem, но он выпрыгивает из-за того, что вы не делали «с сеансом» – dga
Все ли ваши значения y_ 0, если это возможно? Это создало бы градиентный нуль и оставил бы ваш вектор параметров без изменений между итерациями. Вы можете отлаживать, добавляя инструкции tf.Print для печати промежуточных значений в вашем вычислительном графе –
Спасибо за ваш вклад, я рассмотрю эти параметры, когда у меня будет время вне встреч (лоты сегодня, zzz) – amaxwell