Конфигурация переменной TensorFlow
Я успешно реализовал алгоритм прямой связи в TensorFlow, который выглядел следующим образом...
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784]) # mnist data image of shape 28*28=784
y = tf.placeholder(tf.float32, [None, 10]) # 0-9 digits recognition => 10 classes
# set model weights
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# construct model
logits = tf.matmul(x, W) + b
pred = tf.nn.softmax(logits) # Softmax
# minimize error using cross entropy
cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=1))
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(cost)
# initializing the variables
init = tf.global_variables_initializer()
... и тренировочный цикл был следующим...
# launch the graph
with tf.Session() as sess:
sess.run(init)
# training cycle
for epoch in range(FLAGS.training_epochs):
avg_cost = 0
total_batch = int(mnist.train.num_examples/FLAGS.batch_size)
# loop over all batches
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(FLAGS.batch_size)
_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys})
... остальная часть кода не нужна. До этого момента код работает идеально. Важно отметить, что мой batch_size
100. Проблема в том, что я использую tf.placeholder
для моих ценностей, но на самом деле мне нужно изменить их, чтобы использовать tf.get_variable
, Первым делом я изменил следующее...
# tf Graph Input
x = tf.get_variable("input_image", shape=[100,784], dtype=tf.float32)
y = tf.placeholder(shape=[100,10], name='input_label', dtype=tf.float32) # 0-9 digits recognition => 10 classes
# set model weights
W = tf.get_variable("weights", shape=[784, 10], dtype=tf.float32, initializer=tf.random_normal_initializer())
b = tf.get_variable("biases", shape=[1, 10], dtype=tf.float32, initializer=tf.zeros_initializer())
# construct model
logits = tf.matmul(x, W) + b
pred = tf.nn.softmax(logits) # Softmax
# minimize error using cross entropy
cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=1))
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(cost)
# initializing the variables
init = tf.global_variables_initializer()
...Все идет нормально. Но сейчас я пытаюсь реализовать цикл обучения, и именно здесь я сталкиваюсь с проблемами. Я запускаю тот же тренировочный цикл, что и выше, с batch_size = 100
и я получаю следующие ошибки...
tenorflow.python.framework.errors_impl.InvalidArgumentError: вход 0 узла GradientDescent/update_input_image/ApplyGradientDescent был передан с плавающей точкой из _recv_input_image_0:0, несовместимый с ожидаемым float_ref.
Как я могу исправить эту проблему? Ошибка исходит из следующей строки...
_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys})
1 ответ
Мне непонятно, почему вы должны были изменить x
к tf.Variable
когда вы продолжаете кормить значение для него. Есть два обходных пути (не считая случая, когда вы могли бы просто вернуться x
чтобы быть tf.placeholder()
как в рабочем коде):
Ошибка поднимается, потому что
optimizer
пытается применить обновление SGD к вводимому вами значению (что приводит к сбивающей с толку ошибке времени выполнения). Вы могли бы предотвратитьoptimizer
сделать это, передавtrainable=False
при строительствеx
:x = tf.get_variable("input_image", shape=[100, 784], dtype=tf.float32, trainable=False)
поскольку
x
переменная, вы можете назначить изображение переменной на отдельном шаге перед запускомoptimizer
,x = tf.get_variable("input_image", shape=[100, 784], dtype=tf.float32) x_placeholder = tf.placeholder(tf.float32, shape=[100, 784]) assign_x_op = x.assign(x_placeholder).op # ... for i in range(total_batch): batch_xs, batch_ys = mnist.train.next_batch(FLAGS.batch_size) # Assign the contents of `batch_xs` to variable `x`. sess.run(assign_x_op, feed_dict={x_placeholder: batch_xs}) # N.B. Now you do not need to feed `x`. _, c = sess.run([optimizer, cost], feed_dict={y: batch_ys})
Эта последняя версия позволит вам выполнить градиентный спуск содержимого изображения (возможно, именно поэтому вы захотите сохранить его в переменной в первую очередь).