Tensorflow 在自定义丢失函数中使用`switch`/`cond`

Tensorflow 在自定义丢失函数中使用`switch`/`cond`,tensorflow,neural-network,keras,loss-function,Tensorflow,Neural Network,Keras,Loss Function,我需要在keras中实现一个自定义损失函数,该函数计算标准的分类交叉熵,除非y_true都是零 这是我的尝试: def masked_crossent(y_true, y_pred): return K.switch(K.any(y_true), losses.categorical_crossentropy(y_true, y_pred), losses.categorical_crossentropy(y

我需要在keras中实现一个自定义损失函数,该函数计算标准的分类交叉熵,除非
y_true
都是零

这是我的尝试:

def masked_crossent(y_true, y_pred):
    return K.switch(K.any(y_true),
                    losses.categorical_crossentropy(y_true, y_pred),
                    losses.categorical_crossentropy(y_true, y_pred) * 0)
但是,一旦培训开始,我就会出现以下错误(编译工作正常):

~/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py 在init(self、graph、fetches、feed) 419自我操作附加(真) 420其他: -->421 self.\u assert\u fetchable(图,fetch.op) 422 self.\u fetches.append(fetch\u name) 423自我操作附加(错误)

~/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py in_assert_可获取(self、graph、op) 432如果不是图形,则可获取(op): 433提升值错误( -->434“操作%r已标记为不可获取”。%op.name) 435 436 def获取(自):

ValueError:操作“IsVariableInitialized_4547”已标记为 不可获取

除了损失。分类交叉熵(y_true,y_pred)*0,我还尝试了以下各种错误(编译期间或培训开始后):


。。。尽管我认为有一种简单的方法可以做到这一点。

我只有一个解决方法的想法:

def masked_crossent(y_true, y_pred):
    return K.max( y_true ) * K.categorical_crossentropy(y_true, y_pred)
如果这是针对整个批次,则需要添加轴=-1

def masked_crossent(y_true, y_pred):
    return K.max( y_true ) * K.categorical_crossentropy(y_true, y_pred)