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)乘以红色乘积是的,这是一个数学属性,你可以做这些替换。这个问题的答案已经在这里了: