我需要在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))
......虽然我想有一种无关紧要的方法可以做到这一点。
答案 0 :(得分:1)
我只想到一个解决方法:
def masked_crossent(y_true, y_pred):
return K.max( y_true ) * K.categorical_crossentropy(y_true, y_pred)
如果是整批,则需要添加axis = -1
。