如何从最后一层slim-tensorflow InceptionNet v3模型中提取特征?

时间:2018-04-05 16:15:35

标签: python tensorflow tensorflow-slim

我精确调整了slim-tensorflow库中给出的InceptionNet v3模型。我在自己的数据集上训练了模型。现在,我有.ckpt和.meta文件的模型。

现在,据我所知,我有两种方法可以恢复模型和权重。首先,从像这样的.meta文件

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/'))

第二种方法是调用模型并恢复检查点。喜欢这个

 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)

现在,我想我的目的第二种方式更容易。

现在,我的问题是,在恢复模型后,如何从最后一层提取特征给定图像?我在此处列出了模型的屏幕截图Model layers 我找到的一个解决方案是这样的,据我所知,我必须从 PreLogits 层提取功能,但我不知道如何在这里设置值

   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

在这里,我无法找到我应该传递给get_tenor_by_name(??)的内容,以及如何在这里传递sess.run?

谢谢。如果有其他方法可以恢复模型并获得功能,请告诉我。

1 个答案:

答案 0 :(得分:0)

我已经找到了解决方法。

# 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})