Python “tf.multiply”和“*”之间有什么区别?

Python “tf.multiply”和“*”之间有什么区别?,python,tensorflow,keras,Python,Tensorflow,Keras,导入tensorflow.kera.backend为K后 tf.multiply和*之间有什么区别? 同样地,K.pow(x,-1)和1/x之间有什么区别? 我基于其他人的代码编写了自定义度量函数的以下代码 def dice_coef_weight_sub(y_true, y_pred): """ Returns the product of dice coefficient for each class """ y_true_f = (Lambda(lambda

导入tensorflow.kera.backend为K后

tf.multiply和
*
之间有什么区别?

同样地,
K.pow(x,-1)
1/x
之间有什么区别?

我基于其他人的代码编写了自定义度量函数的以下代码

def dice_coef_weight_sub(y_true, y_pred):
    """
    Returns the product of dice coefficient for each class
    """
    y_true_f = (Lambda(lambda y_true: y_true[:, :, :, :, 0:])(y_true))
    y_pred_f = (Lambda(lambda y_pred: y_pred[:, :, :, :, 0:])(y_pred))

    product = tf.multiply([y_true_f, y_pred_f]) # multiply should be import from tf or tf.math

    red_y_true = K.sum(y_true_f, axis=[0, 1, 2, 3]) # shape [None, nb_class]
    red_y_pred = K.sum(y_pred_f, axis=[0, 1, 2, 3])
    red_product = K.sum(product, axis=[0, 1, 2, 3])

    smooth = 0.001
    dices = (2. * red_product + smooth) / (red_y_true + red_y_pred + smooth)

    ratio = red_y_true / (K.sum(red_y_true) + smooth)
    ratio = 1.0 - ratio
    # ratio =  K.pow(ratio + smooth, -1.0) # different method to get ratio

    return K.sum(multiply([dices, ratio]))
在代码中,我可以将
tf.乘以
*
?我可以用
1/x
替换
K.pow(x,-1)


(从tensorflow的文档中,我知道
tf.pow
K.pow
之间的区别:
tf.pow(x,y)
接收2个张量来计算
x
y
中相应元素的x^y,而
K.pow(x,a)
接收一个张量
x
和一个整数
a
来计算x^a。但是我不知道为什么在上面的代码中
K.pow
接收一个浮点数1.0,它仍然工作正常)

假设
*
的两个操作数都是
tf.tensor
s而不是
tf.sparse.SparseTensor
s,
*
运算符与
tf.multiply
相同,即支持广播的元素乘法

如果您有兴趣研究执行运算符重载的源代码,关键部分包括:

  • 对于
    tf.sparse.SparseTensor
    s,
    *
    使用稀疏张量特定乘法运算重载

    假设您使用的是Python3,
    /
    操作符重载到
    tf.math.truediv
    (即,浮点除法,对应于TensorFlow的
    RealDiv
    运算)

    在Python2中,
    /
    运算符可能正在进行整数除法,在这种情况下,它会以依赖于数据类型的方式重载。对于浮动数据类型,它是
    tf.math.truediv
    ,对于整数数据类型,它是
    tf.math.floordiv
    (整数地板分割)


    tf.pow()
    使用不同的运算符(即
    pow
    )运算符。但是假设所有的数据类型都是浮点型,
    1/x
    tf.pow(x,-1.0)
    应该是等价的。

    假设
    *
    的两个操作数都是
    tf.Tensor
    s而不是
    tf.sparse.SparseTensor
    s,则
    *
    运算符与
    tf.multiply
    相同,即。,具有广播支持的元素级乘法

    如果您有兴趣研究执行运算符重载的源代码,关键部分包括:

  • 对于
    tf.sparse.SparseTensor
    s,
    *
    使用稀疏张量特定乘法运算重载

    假设您使用的是Python3,
    /
    操作符重载到
    tf.math.truediv
    (即,浮点除法,对应于TensorFlow的
    RealDiv
    运算)

    在Python2中,
    /
    运算符可能正在进行整数除法,在这种情况下,它会以依赖于数据类型的方式重载。对于浮动数据类型,它是
    tf.math.truediv
    ,对于整数数据类型,它是
    tf.math.floordiv
    (整数地板分割)


    tf.pow()
    使用不同的运算符(即
    pow
    )运算符。但是假设所有的数据类型都是浮点型,
    1/x
    tf.pow(x,-1.0)
    应该是等价的。

    AFAIK,.*是元素乘法的符号,类似于matlab,我不知道
    //code>Python没有。*,这里只有2。(2.0)乘以red_乘积是的,这是一个数学属性,你可以做这些替换。这个问题的答案已经在这里了:AFAIK,.*是元素乘法的符号,类似于matlab,我不知道
    /
    Python没有。*,这里只有2。(如2.0)乘以红色乘积是的,这是一个数学属性,你可以做这些替换。这个问题的答案已经在这里了: