我正在使用Theano编写自动编码器模型,(我是Theano的新手)。成本函数具有稀疏性约束。 KL发散函数在数组中产生NaN值,当我对数组求和以将其添加到总成本时它给出NaN值。有没有办法解决这个问题。
KL = rho * (T.log(rho/rho_hat)) + (1 - rho) * (T.log((1 - rho)/(1 - rho_hat)))
# sparsity cost
SPcost = beta * KL.nansum()
# the loss function
loss = T.nnet.categorical_crossentropy(y_hat, y).mean() + loss_reg
我正在尝试使用测试功能进行调试
test=theano.function([X], SPcost)
test(train_X)
SPcost应该给我一个标量值,而不是它显示数组(nan) 我试图使用numpy nansum(),但这给了我一个错误。使用NaN值对数组求和的正确方法是什么?任何建议将不胜感激。
由于数字问题NaN可能随时弹出,所以基本上是不可避免的。我在theano寻找处理nan的功能,但没有找到任何有帮助我的东西。
答案 0 :(得分:0)
当您遇到nan
时,您完全理解其含义,switch()
和isnan()
提供了一条出路:
KL = T.switch(T.isnan(KL), 0., KL)
其中KL
是一个包含nan
的张量,您希望用0
代替(尽管需要支付一定的费用)。
然后您可以T.sum(KL)
像平常一样。