2016-07-27 4 views
2

Я скачал tensorflow GraphDef, который реализует VGG16 ConvNet, который я использую это сделать:Tensorflow: как вставить пользовательский ввод в существующий граф?

Pl['images'] = tf.placeholder(tf.float32, 
          [None, 448, 448, 3], 
          name="images") #batch x width x height x channels 
with open("tensorflow-vgg16/vgg16.tfmodel", mode='rb') as f: 
    fileContent = f.read() 

graph_def = tf.GraphDef() 
graph_def.ParseFromString(fileContent) 
tf.import_graph_def(graph_def, input_map={"images": Pl['images']}) 

Кроме того, у меня есть особенности изображения, которые являются однородными по выходу "import/pool5/".

Как я могу рассказать о своем графике, который не хочет использовать его вход "images", но тензор "import/pool5/" как вход?

Thank's!

EDIT

ОК Я понимаю, что не очень понятно. Вот так:

Я пытаюсь использовать this implementation пула ROI, используя предварительно подготовленный VGG16, который у меня есть в формате GraphDef. Так вот что я делаю:

Прежде всего, я загружаю модель:

tf.reset_default_graph() 
with open("tensorflow-vgg16/vgg16.tfmodel", 
      mode='rb') as f: 
    fileContent = f.read() 
graph_def = tf.GraphDef() 
graph_def.ParseFromString(fileContent) 
graph = tf.get_default_graph() 

Затем я создаю мои заполнители

images = tf.placeholder(tf.float32, 
           [None, 448, 448, 3], 
           name="images") #batch x width x height x channels 
boxes = tf.placeholder(tf.float32, 
          [None,5], # 5 = [batch_id,x1,y1,x2,y2] 
          name = "boxes") 

И я определяю выход первой части график, чтобы быть conv5_3/РЕЛУ

tf.import_graph_def(graph_def, 
        input_map={'images':images}) 
out_tensor = graph.get_tensor_by_name("import/conv5_3/Relu:0") 

Так, out_tensor имеет форму [None,14,14,512]

Затем я делаю ROI пулы:

[out_pool,argmax] = module.roi_pool(out_tensor, 
            boxes, 
            7,7,1.0/1) 

С out_pool.shape = N_Boxes_in_batch x 7 x 7 x 512, который является однородным по pool5. Я бы тогда, как кормить out_pool в качестве вклада в ор, который приходит только после того, как pool5, так что это будет выглядеть как

tf.import_graph_def(graph.as_graph_def(), 
        input_map={'import/pool5':out_pool}) 

Но это не работает, у меня есть эта ошибка:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-89-527398d7344b> in <module>() 
     5 
     6 tf.import_graph_def(graph.as_graph_def(), 
----> 7      input_map={'import/pool5':out_pool}) 
     8 
     9 final_out = graph.get_tensor_by_name("import/Relu_1:0") 

/usr/local/lib/python3.4/dist-packages/tensorflow/python/framework/importer.py in import_graph_def(graph_def, input_map, return_elements, name, op_dict) 
    333  # NOTE(mrry): If the graph contains a cycle, the full shape information 
    334  # may not be available for this op's inputs. 
--> 335  ops.set_shapes_for_outputs(op) 
    336 
    337  # Apply device functions for this op. 

/usr/local/lib/python3.4/dist-packages/tensorflow/python/framework/ops.py in set_shapes_for_outputs(op) 
    1610  raise RuntimeError("No shape function registered for standard op: %s" 
    1611       % op.type) 
-> 1612 shapes = shape_func(op) 
    1613 if len(op.outputs) != len(shapes): 
    1614  raise RuntimeError(

/home/hbenyounes/vqa/roi_pooling_op_grad.py in _roi_pool_shape(op) 
    13 channels = dims_data[3] 
    14 print(op.inputs[1].name, op.inputs[1].get_shape()) 
---> 15 dims_rois = op.inputs[1].get_shape().as_list() 
    16 num_rois = dims_rois[0] 
    17 

/usr/local/lib/python3.4/dist-packages/tensorflow/python/framework/tensor_shape.py in as_list(self) 
    745  A list of integers or None for each dimension. 
    746  """ 
--> 747  return [dim.value for dim in self._dims] 
    748 
    749 def as_proto(self): 

TypeError: 'NoneType' object is not iterable 

Любая подсказка?

+0

'input_map' может принимать произвольное имя ввода в графе. Я бы распечатал graph_def, чтобы выяснить точное имя пула вывода –

+0

Итак, если я понял ваш вопрос, у вас есть op, например: y = tf.mul (x, W) , и вы хотите изменить его вход x на другой тензор xprime, исходящий из другой сети? – jean

ответ

1

Что я хотел бы сделать что-то вдоль этих линий:

-Первых получить имена тензоров, представляющих вес и уклоны 3 полностью соединенных слоев, поступающих после pool5 в VGG16.
Чтобы сделать это, я бы осмотрел [n.name for n in graph.as_graph_def().node]. (Они, вероятно, выглядят примерно как import/locali/weight: 0, import/locali/bias: 0 и т. Д.)

-Положите их в списке питона:

weights_names=["import/local1/weight:0" ,"import/local2/weight:0" ,"import/local3/weight:0"] 
biases_names=["import/local1/bias:0" ,"import/local2/bias:0" ,"import/local3/bias:0"] 

-define функции, выглядеть так:

def pool5_tofcX(input_tensor, layer_number=3): 
    flatten=tf.reshape(input_tensor,(-1,7*7*512)) 
    tmp=flatten 
    for i in xrange(layer_number): 
    tmp=tf.matmul(tmp, graph.get_tensor_by_name(weights_name[i])) 
    tmp=tf.nn.bias_add(tmp, graph.get_tensor_by_name(biases_name[i])) 
    tmp=tf.nn.relu(tmp) 
    return tmp 

Затем определяют тензор с помощью функции:

wanted_output=pool5_tofcX(out_pool) 

Тогда все готово!

+0

Кажется, что работает, спасибо! Я просто изменил 14 * 14 на 7 * 7 (так как это после максимального объединения), и я добавил ReLu после bias_add. – HediBY

+0

Да, забыл о RELU внесет изменения! – jean

0

Как правило, очень удобно использовать tf.train.export_meta_graph для хранения всего MetaGraph. Затем, после восстановления, вы можете использовать , , потому что получается, что он передает все дополнительные аргументы в базовый import_scoped_meta_graph, который имеет аргумент input_map и использует его, когда он получает свой собственный вызов import_graph_def.

Это не задокументировано, и я взял waaaay toooo много времени, чтобы найти его, но он работает!

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