根据本教程,我已经使用Keras Tensorflow训练了Pix2Pix网络。Pix2Pix使用实例归一化,因此在进行推理时,我们需要使用实例归一化层(批量大小为1的批量范数(来计算样本均值和方差。在Tensorflow中,我会将前锋称为pred=model(x,training=True(。该模型是Pix2Pix的生成器部分,Pix2Pix是一个具有实例规范化的UNet。
model = tf.keras.models.load_model("pix2pix")
pred = model(img, training=True)
https://www.tensorflow.org/tutorials/generative/pix2pix
我们在C++中使用这个模型,使用OpenCV DNN来执行推理,然而,我们看到";向前";OpenCV DNN的调用执行为Training=False,即它在模型中使用训练均值和方差,而不是获得样本均值和方差。此外,在中间表示中使用OpenVINO对模型进行了优化。
print('OpenCV DNN Inference...')
print('OCV Version is',cv2.__version__)
# Load model
net = cv2.dnn.readNet("model.bin", "model.xml")
# Format input
blob = cv2.dnn.blobFromImages(img)
net.setInput(blob)
pred = net.forward()
有没有一种方法可以告诉OpenCV DNN Forward调用进行推理,就好像Training=True一样?
这个问题实际上是关注OpenCV而不是OpenVINO。为了得到更深入的解释,最好将其重定向到他们的论坛/平台,因为他们是这些方面的合适专家。
通常,training
自变量通知神经网络层它应该走哪条路径,因为层的行为在训练和推理过程中是不同的
参考您共享的链接,已经解释了training=True在训练阶段算法中是有意的,因为您在测试数据集上运行模型时需要批量统计信息。如果使用training=False,则会获得从训练数据集中学习到的累积统计信息(这是您不想要的(。
简而言之,您需要知道您的层在训练和推理过程中需要执行什么(取决于您的软件设计(。然后,根据训练/推理阶段将条件分配给training
自变量。