Воспроизведение вывода модуля Tensorflow Hub с помощью Tensorflow Slim

Я пытаюсь воспроизвести вывод модуля Tensorflow Hub, который основан на Tensorflow Slim контрольной точке, используя модули 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.

Дайте мне знать, что вы думаете!


person gorjan    schedule 29.07.2019    source источник


Ответы (1)


Эти модули Hub масштабируют свои входные данные от канонического диапазона [0,1] до того, что соответствующая тонкая контрольная точка ожидает от предварительной обработки, с которой она была обучена (обычно [-1, + 1] для предварительной обработки в стиле «Начальный»). Передача им одинаковых входных данных может объяснить большую разницу. Даже после линейного масштабирования, чтобы исправить это, разница вплоть до смешанной числовой ошибки меня не удивит (учитывая множество степеней свободы внутри TF), но серьезные несоответствия могут указывать на ошибку.

person arnoegw    schedule 29.07.2019