2017-02-17 3 views
11

Я обучил модель DCGAN и теперь хотел бы загрузить ее в библиотеку, которая визуализирует драйверы активации нейронов с помощью оптимизации пространства изображений.Настройте input_map при импорте модели тензорного потока из файла metagraph

Следующий код работает, но заставляет меня работать с изображениями (1, ширина, высота, каналы) при последующем анализе изображений, что является болью (предположения библиотеки о форме ввода в сеть).

# creating TensorFlow session and loading the model 
graph = tf.Graph() 
sess = tf.InteractiveSession(graph=graph) 

new_saver = tf.train.import_meta_graph(model_fn) 
new_saver.restore(sess, './') 

Я хотел бы изменить input_map, После прочтения источника, я ожидал этот код для работы:

graph = tf.Graph() 
sess = tf.InteractiveSession(graph=graph) 

t_input = tf.placeholder(np.float32, name='images') # define the input tensor 
t_preprocessed = tf.expand_dims(t_input, 0) 

new_saver = tf.train.import_meta_graph(model_fn, input_map={'images': t_input}) 
new_saver.restore(sess, './') 

Но получил ошибку:

ValueError: tf.import_graph_def() requires a non-empty name if input_map is used.

Когда стек доходит до tf.import_graph_def() для поля имени указано значение import_scope, поэтому я попробовал следующее:

graph = tf.Graph() 
sess = tf.InteractiveSession(graph=graph) 

t_input = tf.placeholder(np.float32, name='images') # define the input tensor 
t_preprocessed = tf.expand_dims(t_input, 0) 

new_saver = tf.train.import_meta_graph(model_fn, input_map={'images': t_input}, import_scope='import') 
new_saver.restore(sess, './') 

Какой сетчатой ​​мне следующую KeyError:

KeyError: "The name 'gradients/discriminator/minibatch/map/while/TensorArrayWrite/TensorArrayWriteV3_grad/TensorArrayReadV3/RefEnter:0' refers to a Tensor which does not exist. The operation, 'gradients/discriminator/minibatch/map/while/TensorArrayWrite/TensorArrayWriteV3_grad/TensorArrayReadV3/RefEnter', does not exist in the graph."

Если установить 'import_scope', я получаю ту же ошибку или не установлен I 'input_map'.

Я не уверен, куда идти отсюда.

+0

Если у вас есть автономный пример, я рад посмотреть на него. Вы можете видеть, как 'input_map' используется в [тесте] (https://www.github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/meta_graph_test.py#L262). Я постараюсь как можно ближе пройти тест и посмотреть, где он расходится. – drpng

+0

@drpng В gitub-проблеме, которую я открыл (https://github.com/tensorflow/tensorflow/issues/7634), приведен полный пример. Спасибо за рекомендацию посмотреть тест. Я попробую подход, который он излагает для функций более низкого уровня. – Sevenless

ответ

1

В новой версии tensorflow> = 1.2.0 следующий шаг работает нормально.

t_input = tf.placeholder(np.float32, shape=[None, width, height, channels], name='new_input') # define the input tensor 

# here you need to give the name of the original model input placeholder name 
# For example if the model has input as; input_original= tf.placeholder(tf.float32, shape=(1, width, height, channels, name='original_placeholder_name')) 
new_saver = tf.train.import_meta_graph(/path/to/checkpoint_file.meta, input_map={'original_placeholder_name:0': t_input}) 
new_saver.restore(sess, '/path/to/checkpointfile') 
0

Итак, основная проблема заключается в том, что вы не используете синтаксис справа. Проверьте документацию для tf.import_graph_def на использование input_map (link).

Давайте Разбивка эта линия:

new_saver = tf.train.import_meta_graph(model_fn, input_map={'images': t_input}, import_scope='import') 

Вы не обрисовать, что model_fn есть, но он должен быть путь к файлу. Для следующей части, в input_map, вы говорите: заменить вход в исходного графа (DCGAN) которого name является images с моей переменной (в текущем графике) называется t_input. Проблематично, t_input и images ссылаются на тот же объект по-разному, как на этой линии:

t_input = tf.placeholder(np.float32, name='images') 

Другими словами, images в input_map должно быть на самом деле то, что имя переменной является то, что вы пытаетесь заменить в DCGAN граф. Вам нужно будет импортировать график в его базовую форму (т. Е. Без линии input_map) и выяснить, к какому имени переменной вы хотите привязать. Он будет в списке, возвращаемом tf.get_collection('variables') после импорта графика. Ищите размеры (1, ширина, высота, каналы), но со значениями вместо имен переменных. Если это местозаполнитель, он будет выглядеть примерно так: scope/Placeholder:0, где scope заменяется любой областью переменной.

Слово предостережения:

Tensorflow очень привередливы о том, что он ожидает, что графики выглядеть. Итак, если в исходной спецификации графика указаны ширина, высота и каналы, тогда Tensorflow будет жаловаться (вызывать ошибку), когда вы пытаетесь подключить placeholder с другим набором измерений. И это имеет смысл. Если система была подготовлена ​​с некоторым набором измерений, тогда она знает только, как создавать изображения с этими размерами.

В теории вы все равно можете придерживаться всех видов странных вещей в передней части этой сети. Но вам нужно будет масштабировать его, чтобы он сначала соответствовал этим измерениям (и в документации Tensorflow говорится, что лучше делать это с CPU за пределами графика, т. Е. Перед вводом его с feed_dict).

Надеюсь, что это поможет!