2016-07-27 9 views
2

Ich habe eine tensorflow GraphDef heruntergeladen, die eine VGG16 ConvNet implementiert, die ich diesen Einsatz zu tun:Tensorflow: Wie fügt man benutzerdefinierte Eingaben in bestehende Graphen ein?

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']}) 

Außerdem habe ich Bildmerkmale, die mit dem Ausgang des "import/pool5/" homogen sind.

Wie kann ich meinem Graphen mitteilen, dass er seine Eingabe "images" nicht verwenden möchte, aber den Tensor "import/pool5/" als Eingabe?

Danke!

EDIT

OK Ich weiß, ich habe nicht sehr klar. Hier ist die Situation:

Ich versuche this implementation ROI-Pooling zu verwenden, mit einem vortrainierten VGG16, die ich im GraphDef-Format habe. Also hier ist, was ich tue:

Zunächst einmal ich das Modell laden:

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() 

Dann erstelle ich meine Platzhalter

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") 

Und ich definieren den Ausgang des ersten Teils die graph zu conv5_3/Relu

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

So out_tensor ist die Form [None,14,14,512]

Dann ich tun, um die ROI-Pooling:

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

Mit out_pool.shape = N_Boxes_in_batch x 7 x 7 x 512, die pool5 homogen ist. Dann möchte ich out_pool als eine Eingabe in den OP füttern, die gerade nach pool5 kommt, so würde es aussehen

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

Aber es funktioniert nicht, ich habe diesen Fehler:

--------------------------------------------------------------------------- 
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 

Irgendeine Ahnung ?

+0

'input_map' kann einen beliebigen Eingabe-Namen im Graphen annehmen. Ich würde graph_def ausdrucken, um den genauen Namen der Pooling-Ausgabe herauszufinden –

+0

Also, wenn ich Ihre Frage verstanden habe, haben Sie ein op zum Beispiel: y = tf.mul (x, W) und Sie möchten seine Eingabe x zu ändern ein anderer Tensor Xprime kommt von einem anderen Netzwerk? – jean

Antwort

1

Was ich tun würde, ist etwas in diese Richtung:

-First die Namen des Tensoren abrufen, die Gewichte und Voreingenommenheit der nach pool5 in VGG16 kommenden 3 vollständig verbundenen Schichten darstellen.
Um dies zu tun, würde ich [n.name for n in graph.as_graph_def().node] inspizieren. (Sie sehen wahrscheinlich so aus wie Import/Locali/Gewicht: 0, Import/Locali/Bias: 0, usw.

)

-Setzen sie in einer Python-Liste:

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 eine Funktion, die wie etwas aussehen:

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 

definieren Sie dann den Tensor mit der Funktion:

wanted_output=pool5_tofcX(out_pool) 

Dann bist du fertig!

+0

Es scheint zu funktionieren, danke! Ich habe gerade die 14 * 14 um eine 7 * 7 geändert (da es nach dem Max Pooling ist), und ich habe die ReLu nach der Bias_add hinzugefügt. – HediBY

+0

Ja vergaß die RELU wird die Änderung vornehmen! – jean

0

Es ist normalerweise sehr bequem, zu verwenden, um den ganzen MetaGraph zu speichern. Nach der Wiederherstellung können Sie dann tf.train.import_meta_graph, verwenden, da sich herausstellt, dass es alle zusätzlichen Argumente an das zugrunde liegende import_scoped_meta_graph übergibt, das das input_map Argument hat und es verwendet, wenn es zu seinem eigenen Aufruf von import_graph_def gelangt.

Es ist nicht dokumentiert, und nahm mir waaoayooooo viel Zeit, um es zu finden, aber es funktioniert!

Verwandte Themen