Я пробовал как на 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. Интересно, почему возникает такая маленькая ошибка значения? Это может не вызывать большой погрешности, но это действительно странно!