python-3.x - 使用 predict_signature_def 保存 keras 多输入模型的签名

标签 python-3.x tensorflow keras

我正在通过以下方式构建多输入模型(简化模型)

model_heads = []
input1 = Input(shape=(batch_input_shape[1], batch_input_shape[2]))
input2 = Input(shape=(batch_input_shape[1], batch_input_shape[2]))
inputs = [input1, input2]

model_layer = Conv1D(filters=8, kernel_size=2, padding='causal', dilation_rate=1, activation='relu', input_shape=(batch_input_shape[1], batch_input_shape[2]), kernel_initializer='he_normal')(inputs[0])
model_layer = MaxPooling1D(2)(model_layer)
model_heads.append(model_layer)
model_layer = Conv1D(filters=16, kernel_size=4, padding='causal', dilation_rate=1, activation='relu', input_shape=(batch_input_shape[1], batch_input_shape[2]), kernel_initializer='he_normal')(inputs[1])
model_layer = MaxPooling1D(4)(model_layer)
model_heads.append(model_layer)
flat_out = []
for j in model_heads:
    flat_out.append(Flatten()(j))
merged = concatenate(flat_out)
merged = Dense(100, activation=self.activation)(merged)
self.model = Model(inputs=inputs, outputs=output)
            self.model.compile(loss='binary_crossentropy', optimizer=self.opt, metrics=['accuracy'])

我提供输入并运行运行良好的训练,但随后我像这样保存模型:
builder = tf.saved_model.builder.SavedModelBuilder(persistencydir + '/saved.' + str(start_prediction) + "." + str(end_prediction))
signature = tf.saved_model.signature_def_utils.predict_signature_def(inputs={'the_input': self.model.input}, outputs={'the_output': self.model.output})
builder.add_meta_graph_and_variables(sess, [tf.saved_model.tag_constants.SERVING], signature_def_map={tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature})
builder.save()

这当然会提示,因为 predict_signature_def期望输入张量,但接收一个 python 列表:
  File "/home/myname/myutils/anaconda3/envs/tmp_merge/lib/python3.6/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py", line 205, in predict_signature_def
    for key, tensor in inputs.items()}
  File "/home/myname/myutils/anaconda3/envs/tmp_merge/lib/python3.6/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py", line 205, in <dictcomp>
    for key, tensor in inputs.items()}
  File "/home/myname/myutils/anaconda3/envs/tmp_merge/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 324, in new_func
    return func(*args, **kwargs)
  File "/home/myname/myutils/anaconda3/envs/tmp_merge/lib/python3.6/site-packages/tensorflow/python/saved_model/utils_impl.py", line 58, in build_tensor_info
    dtype=dtypes.as_dtype(tensor.dtype).as_datatype_enum,
AttributeError: 'list' object has no attribute 'dtype'

还有另一种方法可以保存签名吗?
或者,是否可以使用由原始输入(在我的示例中为 input1 和 input2)组成的单个张量来构建具有多输入的模型。我看到的所有例子都与我在这里看到的相似,但我还没有找到一个也保存签名的例子......

最佳答案

基于此处:https://github.com/tensorflow/tensorflow/issues/39568#issuecomment-631120656 , 你可以做:

signature = tf.saved_model.predict_signature_def(
                        inputs = {'input1':x1,'input2':x2},
                        outputs = {'output1':y1,'output2:y2})

关于python-3.x - 使用 predict_signature_def 保存 keras 多输入模型的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590205/

相关文章:

python - 如何改进在 Python 中移动所有不包含特定日期的文件?

python - 如何在 tensorflow 中顺序和随机读取 tf.data.Iterator ?

python-3.x - 语法错误 : invalid syntax while running Job

python - 图像生成器错误 : Asked to retrieve element 0, 但序列长度为 0

python - Keras 中的条件批量归一化

python-3.x - Python 3 BeautifulSoup4 在源页面中搜索文本

python - 海龟宽度和笔号的区别?

python-3.x - 如何从 Gtk 3 窗口动态添加/删除小部件

python - reshape 具有多个未知维度的张量

python - 使用 Keras 微调 ResNet50 - val_loss 不断增加