Получена небольшая ошибка выходного значения между моделью .h5 и моделью .pb - PullRequest
0 голосов
/ 05 мая 2020

Я пробовал как на tf-gpu1.4+keras2.1.3, так и на tf-gpu1.12+keras2.2.4, и проблема всегда возникает.

Проблема: После того, как я преобразовал модель keras.application.ResNet50 () в модель стоп-графика в формате .pb я вставляю то же изображение в преобразованную модель .pb, но выходное значение меняется немного.

Ниже приведены коды, которые выводят первые 10 элементов Re sNet вектор вывода, а также заморозить график для вывода файла модели pb:

from tensorflow.python.framework.graph_util_impl import convert_variables_to_constants
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, ResNet50
import keras.backend as K
K.set_learning_phase(0)

img = image.load_img('images/34rews.jpg', target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x_input = preprocess_input(x)

net_model = ResNet50(weights='imagenet', include_top=False, pooling='avg')
sess = K.get_session()
preds = sess.run(net_model.get_output_at(0), feed_dict={net_model.get_input_at(0): x_input})
print('before convert to pb :', np.array(preds).squeeze()[:10])

output_name0 = net_model.get_output_at(0).op.name  # 'global_average_pooling2d_1/Mean'
constant_graph = convert_variables_to_constants(sess, sess.graph_def, [output_name0])

with tf.gfile.GFile('saved_model_constant.pb', 'wb') as f:
    f.write(constant_graph.SerializeToString())

и журнал печати:

before convert to pb : [**0.99536467** 0.31807986 2.0998483  0.9077819  0.10606026 0.93215793
 0.04187933 0.10000334 1.1727284  1.0535308 ]

Затем мы прогнозируем то же изображение через файл pb сгенерированный приведенными выше кодами:

def test_constant(pb_dir, img_path='images/34rews.jpg'):
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)

    from tensorflow.python.platform import gfile
    with tf.Session() as sess:
        with gfile.FastGFile(pb_dir, 'rb') as f:
            graph_def = tf.GraphDef()
            graph_def.ParseFromString(f.read())

        result = tf.import_graph_def(graph_def, return_elements=["global_average_pooling2d_1/Mean:0"], name='')
        preds = sess.run(result, feed_dict={sess.graph.get_tensor_by_name('input_1:0'):x})
        print('using pb file:', np.array(preds).squeeze()[:10])

Выходной журнал печати:

using pb file: [**0.99536514** 0.3180797  2.0998483  0.90778273 0.10606024 0.9321572
 0.04187941 0.10000295 1.1727289  1.0535315 ]

Я могу четко найти крайнюю небольшую ошибку значения вектора прогноза между исходной моделью keras и pb после использования метода стоп-кадра. Например, значение первого элемента выходного вектора re snet с использованием исходной модели keras - 0,99536467 , но выходное значение - 0,99536514 с использованием преобразованного файла pb. Интересно, почему возникает такая маленькая ошибка значения? Это может не вызывать большой погрешности, но это действительно странно!

1 Ответ

0 голосов
/ 06 мая 2020

Я удалил K.set_learning_phase(0), и проблема решена. Может быть, было бы лучше позволить Керасу самостоятельно справиться с K.learning_phase (). Для моего эксперимента используйте значение Keras.model.predict () как правильный результат:

with K.set_learning_phase(0) and without convert_variables_to_constants:  value is the same.
without K.set_learning_phase(0) and without convert_variables_to_constants:  value is the same.
without K.set_learning_phase(0) and with convert_variables_to_constants:  value is the same.
with K.set_learning_phase(0) and with convert_variables_to_constants:  value is changed!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...