Retraining Inception v3 model without reshape layer

578 Views Asked by At

I had retrained inception v3 model for a custom dataset. But after retraining when i look at the TenosorGraph i found that a layer named as reshape followed by a fully connected layer is added. I have to run the model on an embedded device using snapdragonneural processing engine(SNPE) but it doesnt support reshape layer as of now to run on DSP.

Is there a possible way of retraining inception v3 without adding reshape layer. Below is the retrain code where the reshape layer is added.

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

The compelete code is available here: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py

2

There are 2 best solutions below

0
On

From SNPE SDK v1.8.0, TensorFlow's reshape layer get supported.

0
On

They aren't adding a reshape layer, they are selecting the reshape layer from the trained model. They will afterwards add their own layer on top of the output of that reshape layer.

If you want to select a higher-up layer, replace 'pool_3/_reshape:0' with the name of the layer you want. You should be able to deduce the names from the model code: https://github.com/tensorflow/models/blob/master/slim/nets/inception_v3.py

or perhaps easier, print the names of all nodes in your graph_def and select the one you want:

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