【问题标题】:Keras dense layer outputs are 'nan'Keras 密集层输出为“nan”
【发布时间】:2023-03-06 09:23:01
【问题描述】:

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

我发现当用activation=None 将张量传递给Dense 层时,该层的输出都是nan

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

问题代码(logits的元素都是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')

普通代码(logits的元素不是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)

有人帮忙吗?非常感谢。

【问题讨论】:

  • 在您的代码中,您根本不使用 logits 张量。所以这个例子没有意义。另外,为什么要在模型中使用损失函数?
  • 尝试其他优化器
  • 我的编辑错误。我确实使用了 logits 张量,并将其传递给我的 CTC 损失层,但在 CTC 损失层的输出中得到了“nan”。我在 TF Debug 中打印了张量,发现“nan”从 Dense 层的输出开始。至于损失函数,Keras 是否在其内置的损失函数中支持 CTC 损失?我找不到它。任何使用 CTC 损失作为损失函数的想法?等待你的答复。非常感谢!
  • 我尝试使用 'SGD'、'Adam'、'Adagrad' 作为优化器,但仍然得到 'nan'。
  • 在 Keras 中,您可以编写自己的损失函数 keras.io/losses。通常你会使用 keras 后端函数来独立于后端。但是你也可以使用所有可以处理张量流张量的东西,包括内置的张量流函数。还有一件事:我不确定 keras 层是否将 name 参数传递给张量。因此,在同一个会话中使用非唯一名称执行两个模型可能会出现问题。

标签: tensorflow keras deep-learning


【解决方案1】:

我可能会误解你,但你为什么要activation="none"? 也许你想要使用的是线性激活?

看看Keras Activation Functions

【讨论】:

  • 是的,我想使用 'linear' 作为激活函数,所以我将其设置为 actiavtion=None。因为我发现 Keras 调用了 ctc_loss() ,这是 Tensorflow 计算 CTC loss 的函数。并且 ctc_loss() 要求输入是不激活的 logits。我使用线性激活但得到了 nan 。这让我很困惑,我花了几天时间才找到错误。
  • 我的错,我不知道它默认为线性。
  • 还是谢谢^^
【解决方案2】:

根据Klemen Grm

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

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

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

【讨论】:

  • 我明白了,我只是测试了我的 CTC 损失函数,还没有添加任何其他层。
猜你喜欢
  • 2021-05-07
  • 2020-08-17
  • 2016-03-24
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2021-07-20
  • 2018-02-22
相关资源
最近更新 更多