Adapting my code from TF1 to TF2.6 I run into trouble. I am trying to add some custom layers to an inception resnet, save the model, and then load and run it.
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model
from tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
import tensorflow as tf
import numpy as np
from PIL import Image
export_path = "./save_test"
# Get model without top and add two layers
base_model = InceptionResNetV2(weights='imagenet', input_tensor=None, include_top=False)
out = base_model.output
out = GlobalAveragePooling2D()(out)
predictions = Dense(7, activation='softmax', name="output")(out)
# Make new model using inputs from base model and custom outputs
model = Model(inputs=base_model.input, outputs=[predictions])
# save model
tf.saved_model.save(model, export_path)
# load model and run
with tf.compat.v1.Session(graph=tf.Graph()) as sess:
tf.compat.v1.saved_model.loader.load(sess, ['serve'], export_path)
graph = tf.compat.v1.get_default_graph()
img = Image.new('RGB', (299, 299))
x = tf.keras.preprocessing.image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = x[..., :3]
x /= 255.0
x = (x - 0.5) * 2.0
y_pred = sess.run('output/Softmax:0', feed_dict={'serving_default_input_1:0': x})
Error: KeyError: "The name 'output/Softmax:0' refers to a Tensor which does not exist. The operation, 'output/Softmax', does not exist in the graph."
What I don't understand: predictions.name is 'output/Softmax:0', but graph.get_tensor_by_name('output/Softmax:0') tells me it does not exist!
Note: I am aware that I can save and load with TF2's tf.keras.models.save and tf.keras.models.load_model and then run the model with model(x). However, in my application I have multiple models in memory and I have found that the inference takes much longer than in my TF1 code using the session object. I would therefore like to use the TF1 approach with the session object in compatibility mode.
How can I control the names of input/output when saving? What am I missing?
from Inference using saved model in Tensorflow 2: how to control in/output?
No comments:
Post a Comment