【发布时间】: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