Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用张量流求局部极大值_Python_Tensorflow_Computer Vision_Signal Processing_Data Science - Fatal编程技术网

Python 用张量流求局部极大值

Python 用张量流求局部极大值,python,tensorflow,computer-vision,signal-processing,data-science,Python,Tensorflow,Computer Vision,Signal Processing,Data Science,我正在寻找一种方法,专门使用TensorFlow获得张量局部极大值的指数 tl;dr 我不是数据科学家。我对计算机视觉背后的理论知之甚少,但我正在尝试使用TensorFlow构建一个计算机视觉应用程序。我计划保存我的模型并使用TF Serving将其作为服务调用,因此我不能依赖于外部库,如numpy、scipy等。我想要实现的算法与scipy的signal.argrelextrema相同,但可以通过我的模型保存并重新运行。已经展示了其他算法,但没有一个在TensorFlow中执行。有人能给我指出

我正在寻找一种方法,专门使用TensorFlow获得张量局部极大值的指数

tl;dr


我不是数据科学家。我对计算机视觉背后的理论知之甚少,但我正在尝试使用TensorFlow构建一个计算机视觉应用程序。我计划保存我的模型并使用TF Serving将其作为服务调用,因此我不能依赖于外部库,如numpy、scipy等。我想要实现的算法与scipy的signal.argrelextrema相同,但可以通过我的模型保存并重新运行。已经展示了其他算法,但没有一个在TensorFlow中执行。有人能给我指出正确的方向吗?

我认为你没有提供足够的信息来澄清。首先,我不确定你想得到张量的最大元素(tf中有一个函数)还是想找到函数的局部最大值(不是张量)。在这种情况下,您可以恢复该函数并找到局部极小值,从而得到您想要的结果。

编辑

我的第一个解决方案是功能性的,但效率低下。它需要五次张量迭代(零轨迹,反向,零轨迹,反向,where)。我现在有了一个只需要两次迭代的解决方案,并且足够灵活,可以快速识别局部极小值

def get_slope(prev, cur):
    # A: Ascending
    # D: Descending
    # P: PEAK (on previous node)
    # V: VALLEY (on previous node)
    return tf.cond(prev[0] < cur, lambda: (cur, ascending_or_valley(prev, cur)), lambda: (cur, descending_or_peak(prev, cur)))

def ascending_or_valley(prev, cur):
    return tf.cond(tf.logical_or(tf.equal(prev[1], 'A'), tf.equal(prev[1], 'V')), lambda: np.array('A'), lambda: np.array('V'))

def descending_or_peak(prev, cur):
    return tf.cond(tf.logical_or(tf.equal(prev[1], 'A'), tf.equal(prev[1], 'V')), lambda: np.array('P'), lambda: np.array('D'))

def label_local_extrema(tens):
    """Return a vector of chars indicating ascending, descending, peak, or valley slopes"""
    # initializer element values don't matter, just the type.
    initializer = (np.array(0, dtype=np.float32), np.array('A'))
    # First, get the slope for each element
    slope = tf.scan(get_slope, tens, initializer)
    # shift by one, since each slope indicator is the slope
    # of the previous node (necessary to identify peaks and valleys)
    return slope[1][1:]

def find_local_maxima(tens):
    """Return the indices of the local maxima of the first dimension of the tensor"""
    return tf.squeeze(tf.where(tf.equal(label_local_extrema(blur_x_tf), 'P')))
def get_斜率(上、当前):
#A:上升
#D:下降
#P:峰值(在上一个节点上)
#V:谷(在上一个节点上)
返回tf.cond(上一个[0]
结束编辑

好的,我已经找到了一个解决方案,但它并不漂亮。下面的函数采用一维张量,并将所有非局部极大值的点减少为零。这只适用于正数,需要修改除float32以外的数据类型,但它满足了我的需要

不过,必须有更好的方法来做到这一点

def zero_descent(prev, cur):
    """reduces all descent steps to zero"""
    return tf.cond(prev[0] < cur, lambda: (cur, cur), lambda: (cur, 0.0))

def skeletonize_1d(tens):
    """reduces all point other than local maxima to zero"""
    # initializer element values don't matter, just the type.
    initializer = (np.array(0, dtype=np.float32), np.array(0, dtype=np.float32))
    # First, zero out the trailing side
    trail = tf.scan(zero_descent, tens, initializer)
    # Next, let's make the leading side the trailing side
    trail_rev = tf.reverse(trail[1], [0])
    # Now zero out the leading (now trailing) side
    lead = tf.scan(zero_descent, trail_rev, initializer)
    # Finally, undo the reversal for the result
    return tf.reverse(lead[1], [0])

def find_local_maxima(tens):
    return tf.where(skeletonize_1d >0)
def归零下降(上、当前):
“”“将所有下降步数减少到零”“”
返回tf.cond(上一个[0]0)

伪:

input_matrix == max_pool(input_matrix)
说明:


当输入值与max_pooling采用的值相同时,这意味着它们是最大值。

我在寻找局部最大值,而不是绝对最大值。换句话说,我想知道所有峰值的指数。每当张量的斜率从正变为负时,就会出现一个峰值。有关图形示例,请参见。