gpt4 book ai didi

python - 在自定义损失函数中 reshape 张量

转载 作者:太空宇宙 更新时间:2023-11-03 11:43:11 25 4
gpt4 key购买 nike

我有一个类似于 this question 的问题.我正在尝试在 keras 中设计一个损失函数,如下所示:

def depth_loss_func(lr):
def loss(actual_depth,pred_depth):
actual_shape = actual_depth.get_shape().as_list()
dim = np.prod(actual_shape[1:])
actual_vec = K.reshape(actual_depth,[-1,dim])
pred_vec = K.reshape(pred_depth,[-1,dim])
di = K.log(pred_vec)-K.log(actual_vec)
di_mean = K.mean(di)
sq_mean = K.mean(K.square(di))

return (sq_mean - (lr*di_mean*di_mean))
return loss

基于 this question 中给出的答案.但是,我收到一个错误:

 TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'

具体来说,这条语句给出了以下输出

(Pdb) actual_depth.get_shape()
TensorShape([Dimension(None), Dimension(None), Dimension(None)])

后端是 TensorFlow。感谢您的帮助。

最佳答案

我设法用形状为 (None, None, None, 9) 的张量重现了你的异常, 当打电话时 np.prod()像这样:

from keras import backend as K

#create tensor placeholder
z = K.placeholder(shape=(None, None, None, 9))
#obtain its static shape with int_shape from Keras
actual_shape = K.int_shape(z)
#obtain product, error fires here... TypeError between None and None
dim = np.prod(actual_shape[1:])

发生这种情况是因为您试图将两个 None 类型的元素相乘, 即使你切片了你的 actual_shape (超过 1 个元素,其中 None )。在某些情况下,您甚至可以获得 TypeErrorNone 之间和 int ,如果切片后只剩下一个非类型元素。

看看 answer你提到过,他们指定了在这些情况下该怎么做,并引用了它:

For the cases where more than 1 dimension are undefined, we can use tf.shape() with tf.reduce_prod() alternatively.

基于此,我们可以使用 K.shape() 将这些操作转换为 Keras API ( docs ) 和 K.prod() ( docs ),分别是:

z = K.placeholder(shape=(None, None, None, 9))
#obtain Real shape and calculate dim with prod, no TypeError this time
dim = K.prod(K.shape(z)[1:])
#reshape
z2 = K.reshape(z, [-1,dim])

此外,对于只有一个维度未定义的情况,请记住使用 K.int_shape(z)或其 wrapper K.get_variable_shape(z)而不仅仅是 get_shape() ,同样在后端 ( docs ) 中定义。希望这能解决您的问题。

关于python - 在自定义损失函数中 reshape 张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45171247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com