2016-02-13 6 views
7

Я хочу изменить тензор, используя обозначение [int, -1] (например, для сглаживания изображения). Но я не знаю первого измерения раньше времени. Один вариант использования - поезд на большой партии, затем оценка на меньшую партию.Измените тензор, используя значение-заполнитель

Зачем возникает следующая ошибка: got list containing Tensors of type '_Message'?

import tensorflow as tf 
import numpy as np 

x = tf.placeholder(tf.float32, shape=[None, 28, 28]) 
batch_size = tf.placeholder(tf.int32) 

def reshape(_batch_size): 
    return tf.reshape(x, [_batch_size, -1]) 

reshaped = reshape(batch_size) 


with tf.Session() as sess: 
    sess.run([reshaped], feed_dict={x: np.random.rand(100, 28, 28), batch_size: 100}) 

    # Evaluate 
    sess.run([reshaped], feed_dict={x: np.random.rand(8, 28, 28), batch_size: 8}) 

Примечание: если у меня есть RESHAPE вне функции она, кажется, работает, но у меня есть очень большие модели, которые я использую несколько раз, так что мне нужно, чтобы держать их в функцию и передать тусклым используя аргумент.

ответ

9

Чтобы сделать эту работу, замените функцию:

def reshape(_batch_size): 
    return tf.reshape(x, [_batch_size, -1]) 

... с функцией:

def reshape(_batch_size): 
    return tf.reshape(x, tf.pack([_batch_size, -1])) 

Причина ошибки заключается в том, что tf.reshape() ожидает значение, конвертируемые в tf.Tensor как его второй аргумент. TensorFlow автоматически преобразует список номеров Python в tf.Tensor, но автоматически не преобразует смешанный список чисел и тензоров (например, tf.placeholder()), вместо того, чтобы поднимать несколько неинтуитивное сообщение об ошибке, которое вы видели.

tf.pack() оп принимает список объектов, конвертируемых в тензор, и преобразует каждый элемент по отдельности, так что он может обрабатывать комбинацию заполнителя и целое число.

+0

У меня возникли проблемы с использованием tf.pack() позже по течению. 'x = reshape (100)' больше не позволяет мне делать 'x.get_shape(). as_list() [- 1]'. Он говорит, что Nonetype не является итерируемым, поэтому он теряет информацию о форме. Есть какие-либо комментарии по этому поводу? – jstaker7

+1

Попробуйте указать 'shape =()', когда вы определяете свой 'batch_size' placeholder. Вы также можете использовать 'Tensor.set_shape()' для предоставления дополнительной информации о форме, которая не выводится, если вы позже положитесь на нее. – mrry

+0

Отлично, спасибо! – jstaker7

0

привет всем, проблема связана с версией Keras. Я пробовал прежде всего без успеха. Удалите Keras и установите через pip. Это сработало для меня.

Я столкнулась эта ошибкой с Keras 1.0.2 & разрешенной с Keras 1.2.0

Надеется, что это поможет. Спасибо

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