我正在尝试使用训练有素的网络来预测新图像。网络使用tf.placeholder,我对argmax的输出层感兴趣。为了训练网络,我使用了32个大小的批次,但是对于新的推论,我感兴趣的是一张一张地评估图像。
据我所知,解决此问题的方法是将占位符的第一维设置为“无”,例如
x_pl = tf.placeholder(tf.float32, shape=[None,224,224,3])
但是,出现问题是因为我使用的网络是由另一个开发人员提供的,该开发人员使用了一些层,当我将batch_size设置为None时,它崩溃了,直到准备tf.nn.conv2d_transpose层时没有大小不兼容。
我的问题是:是否可以将预先训练的网络切成固定的批次大小?
训练后,我使用以下方法保存模型:
inputs = { x_pl.name: x_pl}
outputs = { argmax.name: argmax }
tf.saved_model.simple_save( sess, model_path, inputs, outputs )
然后,在另一个脚本中,我通过调用来加载它:
tf.saved_model.loader.load(
sess2,
[tag_constants.SERVING],
model_path,
)
inference_graph = tf.get_default_graph()
x_pl = inference_graph.get_tensor_by_name("Placeholder:0")
argmax = inference_graph.get_tensor_by_name("ArgMax:0")
问题是x_pl和argmax的大小都为[32,....]。我尝试了tf.slice,tf.split,tf.stride_slice ...,但是当我评估仅由一个图像提供的argmax时,脚本崩溃,提示我应该向PlaceHolder提供一批32张图像。
对我来说似乎很奇怪,我无法对单个预测进行后处理以获得网络,但是我只能找到上述将None放在占位符中的解决方案。可以按照我说的做吗?还是唯一的解决方案是重新编码整个网络?