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 ?
'input_map' kann einen beliebigen Eingabe-Namen im Graphen annehmen. Ich würde graph_def ausdrucken, um den genauen Namen der Pooling-Ausgabe herauszufinden –
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