Настройте 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
).
Надеюсь, что это поможет!