Skip to main content
 首页 » 编程设计

python之仅将 tf.nn.softmax() 应用于张量的正元素

2025年05月04日14insus

我尝试了很长时间来解决这个问题,但在 Internet 上没有找到任何有用的东西,所以我不得不问:

给定张量 T,假设 T = tf.random_normal([100]),我只想应用 softmax()到张量的正元素。像 T = tf.nn.softmax(T[T>0]) 这样的东西在 Tensorflow 中当然不起作用。

简而言之:我想计算 softmax 并仅应用于元素 T > 0。

我如何在 Tensorflow 中做到这一点?

请您参考如下方法:

如果您希望 softmax 计算 + 仅应用于元素 T > 0:

一个想法可能是根据您的条件 (T > 0) 创建 2 个分区,将操作 (softmax) 应用于目标分区,然后将它们缝合回去在一起。

像这样,使用 tf.dynamic_partition和 tf.dynamic_stitch :

import tensorflow as tf 
 
T = tf.random_normal(shape=(2, 3, 4)) 
 
# Creating partition based on condition: 
condition_mask = tf.cast(tf.greater(T, 0.), tf.int32) 
partitioned_T = tf.dynamic_partition(T, condition_mask, 2) 
# Applying the operation to the target partition: 
partitioned_T[1] = tf.nn.softmax(partitioned_T[1]) 
 
# Stitching back together, flattening T and its indices to make things easier:: 
condition_indices = tf.dynamic_partition(tf.range(tf.size(T)), tf.reshape(condition_mask, [-1]), 2) 
res_T = tf.dynamic_stitch(condition_indices, partitioned_T) 
res_T = tf.reshape(res_T, tf.shape(T)) 
 
with tf.Session() as sess: 
    t, res = sess.run([T, res_T]) 
    print(t) 
    # [[[-1.92647386  0.7442674   1.86053932 -0.95315439] 
    #  [-0.38296485  1.19349718 -1.27562618 -0.73016083] 
    #  [-0.36333972 -0.90614134 -0.15798278 -0.38928652]] 
    #  
    # [[-0.42384467  0.69428021  1.94177043 -0.13672788] 
    #  [-0.53473723  0.94478583 -0.52320045  0.36250541] 
    #  [ 0.59011376 -0.77091616 -0.12464728  1.49722672]]] 
    print(res) 
    # [[[-1.92647386  0.06771058  0.20675084 -0.95315439] 
    #  [-0.38296485  0.10610957 -1.27562618 -0.73016083] 
    #  [-0.36333972 -0.90614134 -0.15798278 -0.38928652]] 
    #  
    # [[-0.42384467  0.06440912  0.22424641 -0.13672788] 
    #  [-0.53473723  0.08274478 -0.52320045  0.04622314] 
    #  [ 0.05803747 -0.77091616 -0.12464728  0.14376813]]] 

上一个答案

仅当您希望对 T 的所有元素计算 softmax 但仅应用于大于 0 的元素时,此答案才有效。

使用 tf.where() :

T = tf.where(tf.greater(T, 0.), tf.nn.softmax(T), T)