如何在keras/tensorflow中的自定义度量内扩张y_true?

ogq8wdun  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(135)

我正在尝试为使用keras/tensorflow实现的U-net模型编写一个自定义度量。在该度量中,我需要使用opencv函数,“cv2.dilate”的地面真相。当我尝试使用它时,它给出了错误,因为y_true是一个Tensor,而cv2.dilate需要一个numpy数组。有什么想法如何实现这一点吗?
我试图将Tensor转换为numpy数组,但它不起作用。我搜索了cv 2. dilate的tensorflow实现,但找不到。

7hiiyaii

7hiiyaii1#

如果在膨胀中使用简单的矩形核,一种可能性是使用tf.nn.max_pool2d作为替代。

import numpy as np
import tensorflow as tf
import cv2

image = np.random.random((28,28))
kernel_size = 3
# OpenCV dilation works with grayscale image, with H,W dimensions
dilated_cv = cv2.dilate(image, np.ones((kernel_size, kernel_size), np.uint8))
# TensorFlow maxpooling works with batch and channels: B,H,W,C dimenssions
image_w_batch_and_channels = image[None,...,None]
dilated_tf = tf.nn.max_pool2d(image_w_batch_and_channels, kernel_size, 1, "SAME")

# checking that the results are equal
np.allclose(dilated_cv, dilated_tf[0,...,0])

但是,如果您提到要对地面真实值应用膨胀,则该膨胀不需要是可微的。

from functools import partial
# be sure to put the correct output type, tf.float64 is working in that specific case because numpy defaults to float64, but it might be different in your case
dilated_tf_npfunc = tf.numpy_function(
    partial(cv2.dilate, kernel=np.ones((kernel_size, kernel_size), np.uint8)), [image]
)

相关问题