2016-10-03 3 views
0

Работая над Tensorflow, первым шагом является построение графика данных и использование сеанса для его запуска. Хотя во время моей практики, например, MNIST tutorial. Это во-первых, определяет потерю функции и оптимизатор, со следующими кодами (и модель MLP определяется до этого):Tensorflow: как он тренирует модель?

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) #define cross entropy error function 

loss = tf.reduce_mean(cross_entropy, name='xentropy_mean') #define loss 

optimizer = tf.train.GradientDescentOptimizer(learning_rate) #define optimizer 

global_step = tf.Variable(0, name='global_step', trainable=False) #learning rate 

train_op = optimizer.minimize(loss, global_step=global_step) #train operation in the graph 

Процесс обучения:

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


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}) 

Вот как В этом случае Tensorflow тренировался. Но мой вопрос в том, как Tensorflow знал, какой вес он должен тренировать и обновлять? Я имею в виду, что в учебных кодексах мы пропускаем только y до cross_entropy, но для optimizer или loss мы не передавали никакой информации о структуре напрямую. Кроме того, мы используем словарь для подачи пакетных данных до train_step, но train_step напрямую не использовали данные. Как Tensorflow знал, где использовать эти данные в качестве входных данных?

На мой вопрос, я думал, что это могут быть все эти переменные или константы хранятся в Тензор. Операции, такие как tf.matmul(), должны иметь «подкласс» класса операций Tensorflow (я еще не проверял код). Может существовать некоторый механизм для тензорного потока распознавать отношения между тензорами (tf.Variable(), tf.constant()) и операциями (tf.mul(), tf.div() ...). Я думаю, он мог проверить суперкласс tf.xxxx(), чтобы узнать, является ли он тензором или операцией. Это предположение поднимает мой второй вопрос: должен ли я использовать функцию Tf.xxx Tensorflow, чтобы гарантировать, что shadoworflow может построить правильный график потока данных, даже иногда он более сложный, чем обычные методы Python, или некоторые функции лучше поддерживаются в Numpy, чем Tensorflow?

Мой последний вопрос: Есть ли связь между Tensorflow и C++? Я слышал, что кто-то сказал, что Tensorflow быстрее обычного Python, поскольку он использует C или C++ в качестве бэкэнд. Есть ли какой-либо механизм преобразования для передачи Tensorflow Python кодов на C/C++?

Я также был бы изящным, если бы кто-то мог поделиться некоторыми навыками отладки в кодировании с Tensorflow, так как в настоящее время я просто установил некоторые терминалы (Ubuntu) для проверки каждой части/функций моих кодов.

+0

Вы можете расширить python с помощью библиотек C, так что это один из возможных способов, просто API-интерфейс python для библиотек C. – Marcus

+0

@Marcus Да, это правда. Я задаюсь вопросом о способности Python версии Tensorflow, это быстрее, чем обычная чистая кодировка Python с помощью Numpy или Scipy? –

ответ

1

Вы делаете передать информацию о вашей структуре Tensorflow, когда вы определяете потери с:

loss = tf.reduce_mean(cross_entropy, name='xentropy_mean') 

Обратите внимание, что с Tensorflow вы построить график операций, и каждая операция используется в коде является узлом график.

Когда вы определяете loss вы передаете операцию, сохраненную в cross_entropy, которая зависит от y_ и y. y_ является заполнителем для ввода, тогда как y является результатом y = tf.nn.softmax(tf.matmul(x, W) + b). Смотрите, куда я иду? Операция loss содержит всю информацию, необходимую для построения модели процесса ввода, поскольку она зависит от операции cross_entropy, которая зависит от y_ и y, что зависит от ввода x и весов моделей W.

Так что, когда вы звоните

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

Tensorflow прекрасно знает, какие операции должны быть вычислены при запуске train_step, и он точно знает, куда поместить в операции график данные, проходящие через feed_dict.

Как Tensorflow знает, какие переменные должны быть обучены, ответ прост. Он тренирует любой tf.Variable() в графике операций, который является обучаемым. Обратите внимание, что когда вы определяете global_step, вы устанавливаете trainable=False, потому что вы не хотите вычислять градиенты w.r.t этой переменной.

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