pythontensorflowtensorflow-slim

How to extract features from the last layer of slim-tensorflow InceptionNet v3 model?


I fine-tuned InceptionNet v3 model given in the slim-tensorflow library. I trained the model on my own dataset. Now, I have .ckpt and .meta file for the model.

Now, as far as from I understand, I have two ways to restore the model and the weights. First, from the .meta file like this

checkpoint = './fine_tuned_model/model.ckpt-233700.meta'

with tf.Session() as sess:
    new_saver = tf.train.import_meta_graph(checkpoint)
    print(new_saver)
    new_saver.restore(sess, tf.train.latest_checkpoint('./fine_tuned_model/'))

The second way is to call the model and restore the checkpoint. Like this

 with slim.arg_scope(slim.nets.inception.inception_v3_arg_scope()):
        logits, inceptionv3 = nets.inception.inception_v3(inputs=img, num_classes=5980, is_training=True,
                                                          dropout_keep_prob=.6)

 # Restore convolutional layers:

 variables_to_restore = slim.get_variables_to_restore(exclude=['InceptionV3/Logits', 'InceptionV3/AuxLogits'])
 init_fn = slim.assign_from_checkpoint_fn(model_path, variables_to_restore)

Now, I think for my purpose second way is easier.

Now, my issue is that after restoring the model, how can I extract features from the last to last layer given an Image? I have included a screenshot of the model hereModel layers One solution I found was like this and here as far as I know I have to extract features from PreLogits layer but I am not sure how to set the values here

   with tf.Session() as sess:
        feature_tensor = sess.graph.get_tensor_by_name('mul:0')
        features_last_layer = sess.run(feature_tensor,{inputs: img})
        print features_last_layer

Here, I am unable to find out what should I pass to get_tenor_by_name(??) and also, how pass sess.run here?

Thank you. Please let me know if there are other ways to restore the model and get the features.


Solution

  • I have figured out the solution for this.

    # Placeholder for the image,
    image_tensor = tf.placeholder(tf.float32, shape=(None, 128, 128, 3))
    
    # load the model
    with slim.arg_scope(slim.nets.inception.inception_v3_arg_scope()):
        logits, inceptionv3 = nets.inception.inception_v3(image_tensor,is_training=False)
    
    # Restore convolutional layers:
    
    variables_to_restore = slim.get_variables_to_restore(exclude=['InceptionV3/Logits', 'InceptionV3/AuxLogits'])
    
    # get the latest checkpoint you want to use after training 
    init_fn = slim.assign_from_checkpoint_fn(model_path, variables_to_restore)
    
    
    checkpoint = './fine_tuned_model/model.ckpt-233700.data-00000-of-00001'
    
    saver = tf.train.Saver(variables_to_restore)
    saver.restore(sess, tf.train.latest_checkpoint('./fine_tuned_model/'))
    
    # the required image 
    img_car = cv2.imread('car.jpeg')
    img_car = cv2.resize(img_car,(128, 128))
    imgnumpy = np.ndarray((1,128,128,3))
    imgnumpy[0] = img_car
    
    # get output from any layer you want. 
    output = sess.run(inceptionv3["PreLogits"], feed_dict={image_tensor: imgnumpy})