tutorial guide accuracy graph tensorflow subgraph

graph - guide - tensorflow tutorial pdf



Tensorflow: ¿cómo insertar una entrada personalizada al gráfico existente? (2)

Lo que yo haría es algo así:

-Primero recupere los nombres de los tensores que representan los pesos y los sesgos de las 3 capas conectadas por completo que vienen después de la agrupación 5 en VGG16.
Para hacer eso inspeccionaría [n.name for n in graph.as_graph_def().node] . (Probablemente se vean como import / locali / weight: 0, import / locali / bias: 0, etc.)

-Ponte en una lista de Python:

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

-Defina una función que se asemeje a algo así:

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

Luego defina el tensor usando la función:

wanted_output=pool5_tofcX(out_pool)

¡Entonces has terminado!

He descargado un GraphDef tensorflow que implementa una ConvNet VGG16, que utilizo para hacer esto:

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

Además, tengo funciones de imagen que son homogéneas para la salida de "import/pool5/" .

¿Cómo puedo decirle a mi gráfica que no quiere usar sus "images" entrada, sino el tensor "import/pool5/" como entrada?

Gracias !

EDITAR

OK, me doy cuenta de que no he sido muy claro. Aquí está la situación:

Estoy tratando de usar esta implementación de la combinación de ROI, usando un VGG16 preentrenado, que tengo en el formato GraphDef. Entonces, esto es lo que hago:

Primero que nada, cargo el modelo:

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

Entonces, creo mis marcadores de posición

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

Y defino que el resultado de la primera parte del gráfico sea 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")

Entonces, out_tensor tiene forma [None,14,14,512]

Luego, hago la agrupación de ROI:

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

Con out_pool.shape = N_Boxes_in_batch x 7 x 7 x 512 , que es homogéneo para pool5 . A continuación, me gustaría out_pool como entrada a la pool5 que viene justo después de pool5 , para que se vea como

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

Pero no funciona, tengo este error:

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

Cualquier pista ?


Por lo general, es muy conveniente usar tf.train.export_meta_graph para almacenar todo el MetaGraph. Luego, al restaurar puede usar tf.train.import_meta_graph , ya que resulta que pasa todos los argumentos adicionales al subyacente import_scoped_meta_graph que tiene el argumento input_map y lo utiliza cuando llega a su propia invocación de import_graph_def .

No está documentado, y me llevó demasiado tiempo para encontrarlo, ¡pero funciona!