Настройте input_map при импорте модели tensorflow из файла metagraph

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

Следующий код работает, но заставляет меня работать с изображениями (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, './')

Но получилась ошибка:

ЗначениеError: tf.import_graph_def() требует непустого name, если используется input_map.

Когда стек сбрасывается до 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: "Имя" градиенты/дискриминатор/минибаза/карта/while/TensorArrayWrite/TensorArrayWriteV3_grad/TensorArrayReadV3/RefEnter: 0 'относится к тензору, которого не существует. Операция "градиенты/дискриминатор/минибарабан/карта/while/TensorArrayWrite/TensorArrayWriteV3_grad/TensorArrayReadV3/RefEnter ', не существует на графике."

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

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

Ответ 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')

Ответ 2

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

Пусть пробивает эту строку:

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 сказано, что лучше делать это с процессором за пределами графика, т.е. До ввода его с помощью feed_dict).

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