gpt4 book ai didi

python - tensorflow 中的欧氏距离变换

转载 作者:太空狗 更新时间:2023-10-30 00:18:46 25 4
gpt4 key购买 nike

我想创建一个 tensorflow 函数,复制 euclidean distance transform我的 3 维张量中每个 2 维矩阵的 scipy。

我有一个三维张量,其中第三个轴代表一个单热编码特征。我想为每个特征维度创建一个矩阵,其中每个单元格中的值等于到最近特征的距离。

例子:

input = [[1 0 0]
[0 1 0]
[0 0 1],

[0 1 0]
[0 0 0]
[1 0 0]]

output = [[0 1 1.41]
[1 0 1 ]
[1.41 1 0 ],

[1 0 1 ]
[1 1 1.41]
[0 1 2 ]]

我目前的解决方案是用 python 实现的。该方法遍历特征维度的每个单元格,在单元格周围创建一个环并搜索环是否包含特征。然后它计算单元格到每个特征条目的距离并取最小值。如果环中不包含具有特征的单元格,则搜索环会变宽。

代码:

import numpy as np
import math

def distance_matrix():
feature_1 = np.eye(5)
feature_2 = np.array([[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],])
ground_truth = np.stack((feature_1,feature_2), axis=2)
x = np.zeros(ground_truth.shape)

for feature_index in range(ground_truth.shape[2]):
for i in range(ground_truth.shape[0]):
for j in range(ground_truth.shape[1]):
x[i,j,feature_index] = search_ring(i,j, feature_index,0,ground_truth)
print(x[:,:,0])

def search_ring(i, j,feature_index, ring_size, truth):
if ring_size == 0 and truth[i,j,feature_index] == 1.:
return 0
else:
distance = truth.shape[0]
y_min = max(i - ring_size, 0)
y_max = min(i + ring_size, truth.shape[0] - 1)
x_min = max(j - ring_size, 0)
x_max = min(j + ring_size, truth.shape[1] - 1)

if truth[y_min:y_max+1, x_min:x_max+1, feature_index].sum() > 0:
for y in range(y_min, y_max + 1):
for x in range(x_min, x_max + 1):
if y == y_min or y == y_max or x == x_min or x == x_max:
if truth[y,x,feature_index] == 1.:
dist = norm(i,j,y,x,type='euclidean')
distance = min(distance, dist)
return distance
else:
return search_ring(i, j,feature_index, ring_size + 1, truth)

def norm(index_y_a, index_x_a, index_y_b, index_x_b, type='euclidean'):
if type == 'euclidean':
return math.sqrt(abs(index_y_a - index_y_b)**2 + abs(index_x_a - index_x_b)**2)
elif type == 'manhattan':
return abs(index_y_a - index_y_b) + abs(index_x_a - index_x_b)


def main():
distance_matrix()
if __name__ == '__main__':
main()

我的问题是在 Tensorflow 中复制它,因为我需要它用于 Keras 中的自定义损失函数。如何访问我正在迭代的项目的索引?

最佳答案

我看不出你在 keras 中使用距离变换有任何问题,基本上,你只需要 tf.py_func ,它将现有的 python 函数包装到 tensorflow 运算符。

但是,我认为这里的根本问题是反向传播。您的模型在前向传播中会有任何问题,但您希望传播什么梯度?或者你根本不关心它的梯度。

关于python - tensorflow 中的欧氏距离变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47140842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com