如何从张量返回最大值及其邻居
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),但训练效率不高。
【讨论】:
以上是关于如何从张量返回最大值及其邻居的主要内容,如果未能解决你的问题,请参考以下文章