OpenCV DNN 推理,"training=True"使用样本均值和方差 (Pix2Pix)



根据本教程,我已经使用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自变量。

最新更新