2016-03-23 4 views
4

Предположим, у меня есть типичная модель CNN в TensorFlow.TensorFlow: сеть повтора с другим тензором ввода?

def inference(images): 
    # images: 4D tensor of [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3] size. 
    conv_1 = conv_layer(images, 64, 7, 2) 
    pool_2 = pooling_layer(conv_1, 2, 2) 
    conv_3 = conv_layer(pool_2, 192, 3, 1) 
    pool_4 = pooling_layer(conv_3, 2, 2) 
    ... 
    conv_28 = conv_layer(conv_27, 1024, 3, 1) 
    fc_29 = fc_layer(conv_28, 512) 
    fc_30 = fc_layer(fc_29, 4096) 
    return fc_30 

Типичным вперед проход можно сделать так:

images = input() 
logits = inference(images) 
output = sess.run([logits]) 

Теперь предположим, что моя input функция теперь возвращает пару аргументов, left_images и right_images (стерео камера). Я хочу запустить right_images до conv_28 и left_images до fc_30. Так что-то вроде этого

images = tf.placeholder(tf.float32, [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3]) 
left_images, right_images = input() 
conv_28, fc_30 = inference(images) 
right_images_val = sess.run([conv_28], feed_dict={images: right_images}) 
left_images_val = sess.run([fc_30], feed_dict={images: left_images}) 

Это, однако, не удается с

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.

Я хочу, чтобы избежать необходимости оценки inputs в то кормить его обратно в TensorFlow. Вызов inference дважды с разными аргументами также не будет работать, потому что такие функции, как conv_layer, создают переменные.

Возможно ли повторить запуск сети с помощью другого тензора ввода?

+0

Я не уверен, как объявляются «образы». Это tf.placeholder? Если нет, то это должно произойти. – RaduK

ответ

2

Tensorflow shared Variables - это то, что вы ищете. Заменить все вызовы tf.Variable на tf.get_variable(). Затем вы можете запустить:

images_left, images_right = input() 
with tf.variable_scope("logits") as scope: 
    logits_left = inference(images_left) 
    scope.reuse_variables() 
    logits_right = inference(images_right) 
output = sess.run([logits_left, logits_right]) 

Переменные не создаются снова во втором вызове вывода. Левое и правое изображения обрабатываются с использованием тех же весов. Также ознакомьтесь с моим Tensorflow CNN training toolkit (см. Код training). Я использую этот метод для запуска проверки и обучения вперед на одном и том же графике TensorFlow.

+1

FYI ваша ссылка "train.py' отключена. – dimo414

+0

thx! Я починил это. – MarvMind

+1

Больше не содержит соответствующего контента из-за изменений. Protip: всегда включайте [commit SHA] (https://github.com/TensorVision/TensorVision/blob/25b2f634550d12987f247ac1d0c5db6824bb8c81/bin/tv-train) в ссылках Github – oseiskar

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