2017-08-21 1 views
0

Ich hatte inception v3-Modell für einen benutzerdefinierten Datensatz neu trainiert. Aber nach dem Umlernen, wenn ich mir den TenosorGraph anschaue, habe ich festgestellt, dass eine Ebene mit dem Namen reshape gefolgt von einer vollständig verbundenen Ebene hinzugefügt wurde. Ich muss das Modell auf einem eingebetteten Gerät mit Snapdragononneuring Processing Engine (SNPE) ausführen, aber es unterstützt Reshape Layer ab sofort nicht auf DSP ausgeführt werden.Umschulung Inception v3 Modell ohne Umformschicht

Gibt es eine Möglichkeit, die Einführung v3 ohne Umformen neu zu trainieren. Unten ist der Retrain-Code, wo der Umform-Layer hinzugefügt wird.

enter code here 
       def create_model_info(architecture): 
    """Given the name of a model architecture, returns information about it. 

    There are different base image recognition pretrained models that can be 
    retrained using transfer learning, and this function translates from the name 
    of a model to the attributes that are needed to download and train with it. 

    Args: 
    architecture: Name of a model architecture. 

    Returns: 
    Dictionary of information about the model, or None if the name isn't 
    recognized 

    Raises: 
    ValueError: If architecture name is unknown. 
    """ 
    architecture = architecture.lower() 
    if architecture == 'inception_v3': 
    # pylint: disable=line-too-long 
    data_url = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz' 
    # pylint: enable=line-too-long 
    bottleneck_tensor_name = 'pool_3/_reshape:0' 
    bottleneck_tensor_size = 2048 
    input_width = 299 
    input_height = 299 
    input_depth = 3 
    resized_input_tensor_name = 'Mul:0' 
    model_file_name = 'classify_image_graph_def.pb' 
    input_mean = 128 
    input_std = 128 
     elif architecture.startswith('mobilenet_'): 
     parts = architecture.split('_') 
     if len(parts) != 3 and len(parts) != 4: 
      tf.logging.error("Couldn't understand architecture name '%s'", 
          architecture) 
      return None 
     version_string = parts[1] 
     if (version_string != '1.0' and version_string != '0.75' and 
      version_string != '0.50' and version_string != '0.25'): 
      tf.logging.error(
       """"The Mobilenet version should be '1.0', '0.75', '0.50', or '0.25', 
     but found '%s' for architecture '%s'""", 
       version_string, architecture) 
      return None 
     size_string = parts[2] 
     if (size_string != '224' and size_string != '192' and 
      size_string != '160' and size_string != '128'): 
      tf.logging.error(
       """The Mobilenet input size should be '224', '192', '160', or '128', 
    but found '%s' for architecture '%s'""", 
       size_string, architecture) 
      return None 
     if len(parts) == 3: 
      is_quantized = False 
     else: 
      if parts[3] != 'quantized': 
      tf.logging.error(
       "Couldn't understand architecture suffix '%s' for '%s'", parts[3], 
       architecture) 
      return None 
      is_quantized = True 
     data_url = 'http://download.tensorflow.org/models/mobilenet_v1_' 
     data_url += version_string + '_' + size_string + '_frozen.tgz' 
     bottleneck_tensor_name = 'MobilenetV1/Predictions/Reshape:0' 
     bottleneck_tensor_size = 1001 
     input_width = int(size_string) 
     input_height = int(size_string) 
     input_depth = 3 
     resized_input_tensor_name = 'input:0' 
     if is_quantized: 
      model_base_name = 'quantized_graph.pb' 
     else: 
      model_base_name = 'frozen_graph.pb' 
     model_dir_name = 'mobilenet_v1_' + version_string + '_' + size_string 
     model_file_name = os.path.join(model_dir_name, model_base_name) 
     input_mean = 127.5 
     input_std = 127.5 
     else: 
     tf.logging.error("Couldn't understand architecture name '%s'", architecture) 
     raise ValueError('Unknown architecture', architecture) 

     return { 
      'data_url': data_url, 
      'bottleneck_tensor_name': bottleneck_tensor_name, 
      'bottleneck_tensor_size': bottleneck_tensor_size, 
      'input_width': input_width, 
      'input_height': input_height, 
      'input_depth': input_depth, 
      'resized_input_tensor_name': resized_input_tensor_name, 
      'model_file_name': model_file_name, 
      'input_mean': input_mean, 
      'input_std': input_std, 
     } 

Der compelete Code finden Sie hier: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py

+0

müssen Sie diese Umformlinie löschen und das Modell inception_v3 neu definieren und dann das Modell mit einem vortrainierten Modell neu trainieren. –

+0

Vielen Dank für den Kommentar @IshantMrinal. Wenn möglich, können Sie es ausführlicher erklären? Es wäre wirklich hilfreich. –

Antwort

0

Sie sind keine reshape Schicht hinzufügen, sie die reshape Schicht aus dem trainierten Modell auswählen. Sie fügen später ihre eigene Ebene über die Ausgabe dieser Umformungsschicht hinzu.

Wenn Sie eine höher liegende Ebene auswählen möchten, ersetzen Sie 'pool_3/_reshape: 0' durch den Namen der gewünschten Ebene. https://github.com/tensorflow/models/blob/master/slim/nets/inception_v3.py

oder vielleicht einfacher, die Namen aller Knoten in Ihrem graph_def und wählen Sie das gewünschte Motiv::

for node in graph_def.node: 
     print(node.name) 
0

Von SNPE SDK v1 Sie sollten die Namen aus dem Modellcode ableiten können, .8.0, TensorFlow's reshape Layer wird unterstützt.

Verwandte Themen