我正在通过以下方式构建多输入模型(简化模型)
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/