我正在尝试使用Tensorflow Hub
模块来再现基于Tensorflow Slim
checkpoint的Tensorflow Slim
模块的输出。但是,我似乎无法获得预期的输出。例如,让我们加载所需的库,创建示例输入,并使用占位符填充数据:
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
实现缺少的输入的内部预处理。
让我知道您的想法!
答案 0 :(得分:1)
那些Hub模块将其输入从标准范围[0,1]扩展到相应的苗条检查点对其进行培训的预处理所期望的值(对于“初始样式”预处理,通常为[-1,+ 1])。将相同的输入传递给他们可以解释很大的不同。甚至在进行线性重新缩放以解决该问题之后,达到复合数值误差的差异也不会令我感到惊讶(考虑到TF内部的许多自由度),但是主要差异可能表明存在错误。