如何从张量返回最大值及其邻居

Posted

技术标签:

【中文标题】如何从张量返回最大值及其邻居【英文标题】:How to return max value and it’s neighbors from tensor 【发布时间】:2021-10-03 20:15:13 【问题描述】:

我创建了一个神经网络模型,想自定义损失函数。

我想知道?

我知道 tf.argmax 可以从张量返回最大值的索引。但是是否有可能获得一个新的张量,其中包括 [max 之前的 3 个值、max 之前的 3 个值和 max 之后的 3 个值]

【问题讨论】:

没有足够的时间来写答案,但是看看索引张量。你应该可以做类似tensor[x-3:x+4] 我试过了,不行,因为x也是张量。 索引到 x 直到它不再是张量。我的猜测是,如果你将 x 从 numpy 转换为 ndarray,它看起来像 [[4]],所以如果你只使用 x[0][0] 而不是 x,除非你的张量非常复杂,否则它可能会起作用。 问题是我想自定义损失函数,例如我定义了一个类似“def custom_loss(y_true, y_pred)”的函数。但是在损失函数中,我无法将张量转换为 numpy。 你能提供一个测试输入张量和你想要的输出吗? 【参考方案1】:

刚刚看到你在cmets中说过,你想在非急切模式下运行它(即内部损失函数),因此tensor.numpy()不可用。

让我们创建一个随机张量,并找到最大值及其邻居,而不使用 numpy 和任何其他在 non-eager 模式下不可用的函数:

a = tf.random.uniform((20,), minval=0, maxval=100,dtype=tf.int32)
tf.print(a,summarize=20)
# [5 42 25 18 15 95 1 51 47 42 36 72 92 11 21 32 1 68 84 24]

start_index = tf.maximum(0,tf.subtract(tf.argmax(a,output_type=tf.int32),3))
end_index   = tf.minimum(a.shape[0],tf.add(start_index,7))

max_neighbors = a[start_index: end_index]
tf.print(max_neighbors,summarize=7)
# [25 18 15 95 1 51 47]

以上代码,可以在非急切模式下运行。请注意,您可以将run_eagerly=True 参数传递给model.compile(),以编写代码而不受非急切模式的限制(例如能够转换为numpy),但训练效率不高。

【讨论】:

以上是关于如何从张量返回最大值及其邻居的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow - 为图像张量中的每个像素查找最大3个相邻像素

如何在4d张量中为k个最大元素创建单热张量?

如何有效地检索 Torch 张量中最大值的索引?

TensorFlow:沿轴的张量的最大值

爬山算法

在 TensorFlow 中,如何使用 python 从张量中获取非零值及其索引?