我在使用 Keras CNN (VGGNet( 模型执行预测时遇到问题。它是一种多类分类,以 96x96x3 的图像张量作为输入,产生大小为 114(类(的概率向量。它被Google ML Engine接受为有效模型,并且预测输入image.json的格式正确(一行带有张量(,但调用gcloud ml-engine预测会产生以下错误:
"错误": "预测失败: 模型执行期间出错: 堕胎错误(代码=StatusCode.INVALID_ARGUMENT,详细信息=\"你必须 使用 dtype 浮点数为占位符张量"Placeholder_1"提供值 和形状 [?,114]\t [[节点:Placeholder_1 = 占位符类型=DT_FLOAT, 形状=[?,114], _device=\"/作业:本地主机/副本:0/任务:0/设备:CPU:0\"]]\"(">
我的预测输入image.json
包含
{"x": [ [ [ [ 1.0, 1.0, 1.0 ], ..., [ 1.0, 1.0, 1.0 ] ] ] ]}
生成 save_model.pb 文件的代码是
def build_graph(x):
model = load_model("my-model.model")
labels = pickle.loads(open("labels.pickle", "rb").read())
# classify the input image
probabilities = model.predict(x)
outputs = tf.convert_to_tensor(probabilities)
saver = tf.train.Saver()
return outputs, saver
image_path = "testset/testimage.png"
# preprocess the image for classification
image = cv2.imread(image_path)
image = cv2.resize(image, (96, 96))
image = image.astype("float") / 255.0
image = img_to_array(image)
image = np.expand_dims(image, axis=0)
# Do training
with tf.Graph().as_default() as prediction_graph:
x = image
outputs = tf.placeholder(tf.float32, shape=[None, 114])
outputs, saver = build_graph(x)
with tf.Session(graph=prediction_graph) as sess:
sess.run([tf.local_variables_initializer(), tf.tables_initializer()])
x = tf.placeholder(tf.float32, shape=[None, 96, 96, 3])
sess.run(outputs, {x: image})
# export model
export_dir = "export3"
tf.saved_model.simple_save(
sess,
export_dir,
inputs={"x": tf.placeholder(tf.float32, shape=[None, 96, 96, 3])},
outputs={"y": tf.placeholder(tf.float32, shape=[None, 114])}
)
我在这里错过了什么?有没有更简单的工作方式?该模型也可作为 .json 和 .h5 文件生成
# serialize model to JSON
model_json = model.to_json()
with open("my-model.json", "w") as json_file:
json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("my-model.h5")
感谢您的帮助!
不知何故,[None, 114] 的预期输出形状未实现。
我知道expand_dims后,图像的形状是[1,96,96]。但是由于我不知道你的模型中有什么,我不知道你如何得到大小为 114 的概率向量。
考虑到先前的澄清,一个模糊的建议是检查您是否正在使用 tf。模型中的变量类,以及是否未正确更改形状;自TF以来。变量限制您在创建变量后更改变量形状的能力。
如果不是这种情况,请提供有关模型的更多详细信息。