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

时间:2018-04-26 21:35:47

标签: 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_true, y_pred) * 0)

但是,一旦训练开始,我会收到以下错误(编译工作正常):

  

〜/ anaconda3 / LIB / python3.5 /站点包/ tensorflow /蟒/客户端/ session.py   在 init (自我,图表,提取,Feed)       419 self._ops.append(True)       420其他:    - > 421 self._assert_fetchable(graph,fetch.op)       422 self._fetches.append(fetch_name)       423 self._ops.append(False)

     

〜/ anaconda3 / LIB / python3.5 /站点包/ tensorflow /蟒/客户端/ session.py   在_assert_fetchable中(self,graph,op)       432如果不是graph.is_fetchable(op):       433引发ValueError(    - > 434'操作%r已被标记为不可获取。' %op.name)       435       436 def fetches(self):

     

ValueError:Operation' IsVariableInitialized_4547'已被标记为   不可取。

代替losses.categorical_crossentropy(y_true, y_pred) * 0,我还尝试了以下各种其他错误(无论是在编译期间还是在培训开始之后):

                    K.zeros_like(losses.categorical_crossentropy(y_true, y_pred))

                    K.zeros((K.int_shape(y_true)[0]))

                    K.zeros((K.int_shape(y_true)[0], 1))

......虽然我想有一种无关紧要的方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

我只想到一个解决方法:

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

如果是整批,则需要添加axis = -1