我正在使用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)
有人帮助吗?非常感谢。
答案 0 :(得分:0)
我可能会误会你,但是为什么你要激活=“ none”? 也许您要使用的是线性激活?
答案 1 :(得分:0)
您的神经网络是完全线性的。您可以为隐藏层和输出层考虑不同的激活函数(例如,tanh,Sigmoid,线性)。这既可以限制输出范围,也可以改善网络的学习性能。
除了Klemen所说的,对于最后一个,您想要一个softmax, 将输出标准化为概率。
神经网络必须实现复杂的映射功能,因此它们需要非线性的激活函数,以便引入非常需要的非线性特性,从而使它们能够近似任何函数。没有激活功能的神经元等效于具有线性激活功能的神经元