Keras密集层输出为'nan'

时间:2018-07-31 06:54:50

标签: tensorflow keras deep-learning

我正在使用Keras构建具有CTC损失的RNN模型。

我发现,当使用activation=None将张量传递给Dense层时,该层的输出全部为nan

但是当设置activation='softmax'时,输出是normal而不是nan

问题代码(登录元素均为nan

logits = Dense(out_shape, activation = None, name="logits")(x_permute)#x_permute is a tensor with shape (?,1876,96)
loss_ctc = Lambda(ctc_lambda_func, name='ctc_my')(
    [logits, labels, x_len, lab_len])
model = Model(inputs=[x, labels, x_len, lab_len], outputs=[loss_ctc])
model.compile(loss={'ctc_my': lambda y_true,y_pred: y_pred}, optimizer='adadelta')

正常代码(登录元素不是nan

logits = Dense(out_shape, activation = None, name="logits")(x_permute)#x_permute is a tensor with shape (?,1876,96)
output = Activation(activation="softmax", name="softmax")(logits)
loss_ctc = Lambda(ctc_lambda_func, name='ctc_my')(
    [output, labels, x_len, lab_len])
model = Model(inputs=[x, labels, x_len, lab_len], outputs=[loss_ctc])
model.compile(loss={'ctc_my': lambda y_true,y_pred: y_pred}, optimizer='adadelta')

def ctc_lambda_func(args):

    y_pred, y_true, input_length, label_length = args

    return ctc_batch_cost(y_true, y_pred,input_length,label_length)

有人帮助吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

我可能会误会你,但是为什么你要激活=“ none”? 也许您要使用的是线性激活?

看看Keras Activation Functions

答案 1 :(得分:0)

按照Klemen Grm

  

您的神经网络是完全线性的。您可以为隐藏层和输出层考虑不同的激活函数(例如,tanh,Sigmoid,线性)。这既可以限制输出范围,也可以改善网络的学习性能。

     

除了Klemen所说的,对于最后一个,您想要一个softmax,   将输出标准化为概率。

神经网络必须实现复杂的映射功能,因此它们需要非线性的激活函数,以便引入非常需要的非线性特性,从而使它们能够近似任何函数。没有激活功能的神经元等效于具有线性激活功能的神经元