使用 Tensorflow Slim 重现 Tensorflow Hub 模块输出

Reproduce Tensorflow Hub module output with Tensorflow Slim

我正在尝试使用 Tensorflow Slim 模块重现基于 Tensorflow Slim checkpointTensorflow Hub 模块的输出。但是,我似乎无法获得预期的输出。例如,让我们加载所需的库,创建示例输入和占位符以提供数据:

import tensorflow_hub as hub
from tensorflow.contrib.slim import nets

images = np.random.rand(1,224,224,3).astype(np.float32)
inputs = tf.placeholder(shape=[None, 224, 224, 3], dtype=tf.float32)

加载TF Hub模块:

resnet_hub = hub.Module("https://tfhub.dev/google/imagenet/resnet_v2_152/feature_vector/3")
features_hub = resnet_hub(inputs, signature="image_feature_vector", as_dict=True)["resnet_v2_152/block4"]

现在,让我们对 TF Slim 做同样的事情,并创建一个加载检查点的加载器:

with slim.arg_scope(nets.resnet_utils.resnet_arg_scope()):
    _, end_points = nets.resnet_v2.resnet_v2_152(image, is_training=False)
    features_slim = end_points["resnet_v2_152/block4"]
loader = tf.train.Saver(tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="resnet_v2_152"))

现在,一旦一切就绪,我们就可以测试输出是否相同:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    loader.restore(sess, "resnet_v2_152_2017_04_14/resnet_v2_152.ckpt")
    slim_output = sess.run(features_slim, feed_dict={inputs: images})
    hub_output = sess.run(features_hub, feed_dict={inputs: images})
    np.testing.assert_array_equal(slim_output, hub_output)

但是,断言失败,因为两个输出不相同。我假设这是因为 TF Hub 使用了 TF Slim 实现所缺乏的输入内部预处理。

告诉我你的想法!

这些 Hub 模块将它们的输入从规范范围 [0,1] 扩展到相应的 slim 检查点对它所训练的预处理的期望值(对于 "Inception-style" 预处理通常是 [-1,+1] ).向它们传递相同的输入可以解释很大的差异。即使在线性重新缩放以修复该问题之后,复合数值误差的差异也不会令我感到惊讶(考虑到 TF 内部的许多自由度),但主要差异可能表明存在错误。