use*_*275 12 python machine-learning keras tensorflow tensorflow2.0
将我的代码从 TF1 调整为 TF2.6 我遇到了麻烦。我正在尝试向 inception resnet 添加一些自定义层,保存模型,然后加载并运行它。
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})
Run Code Online (Sandbox Code Playgroud)
错误:
KeyError: "The name 'output/Softmax:0' refers to a Tensor which does not exist. The operation, 'output/Softmax', does not exist in the graph."
我不明白的是:
predictions.name是'output/Softmax:0',但
graph.get_tensor_by_name('output/Softmax:0')告诉我它不存在!
注意:我知道我可以使用 TF2 保存和加载tf.keras.models.save,tf.keras.models.load_model然后使用model(x). 然而,在我的应用程序中,内存中有多个模型,并且我发现推理所需的时间比使用该session对象的 TF1 代码要长得多。因此,我想session在兼容模式下对对象使用 TF1 方法。
保存时如何控制输入/输出的名称?我缺少什么?
如果您还没有这样做,您可以尝试类似以下的操作,因为我相信您在 中引用了错误的键SignatureDef:
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"
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)
model = Model(inputs=base_model.input, outputs=[predictions])
tf.saved_model.save(model, export_path)
with tf.compat.v1.Session(graph=tf.Graph()) as sess:
meta_graph = tf.compat.v1.saved_model.loader.load(sess, ["serve"], export_path)
sig_def = meta_graph.signature_def[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
input_key = list(dict(sig_def.inputs).keys())[0]
input_name = sig_def.inputs[input_key].name
output_name = sig_def.outputs['output'].name
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_name, feed_dict={input_name: x})
print(y_pred)
Run Code Online (Sandbox Code Playgroud)
INFO:tensorflow:Restoring parameters from ./save_test/variables/variables
[[0.14001141 0.13356228 0.14509581 0.22432518 0.16313255 0.11899492
0.07487784]]
Run Code Online (Sandbox Code Playgroud)
您还可以查看SignatureDef输入和输出信息:
INFO:tensorflow:Restoring parameters from ./save_test/variables/variables
[[0.14001141 0.13356228 0.14509581 0.22432518 0.16313255 0.11899492
0.07487784]]
Run Code Online (Sandbox Code Playgroud)
如果删除第一层base_model并添加新Input层,则可以使用静态键名称sig_def.inputs['input'].name和sig_def.outputs['output'].name:
print(meta_graph.signature_def)
{'serving_default': inputs {
key: "input_2"
value {
name: "serving_default_input_2:0"
dtype: DT_FLOAT
tensor_shape {
dim {
size: -1
}
dim {
size: -1
}
dim {
size: -1
}
dim {
size: 3
}
}
}
}
outputs {
key: "output"
value {
name: "StatefulPartitionedCall:0"
dtype: DT_FLOAT
tensor_shape {
dim {
size: -1
}
dim {
size: 7
}
}
}
}
method_name: "tensorflow/serving/predict"
, '__saved_model_init_op': outputs {
key: "__saved_model_init_op"
value {
name: "NoOp"
tensor_shape {
unknown_rank: true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
INFO:tensorflow:Restoring parameters from ./save_test/variables/variables
[[0.21079363 0.10773096 0.07287834 0.06983061 0.10538215 0.09172108
0.34166315]]
Run Code Online (Sandbox Code Playgroud)
请注意,更改第一层的名称base_model不适用于该语法model.layers[0]._name = 'input',因为模型配置本身不会更新。