python - ctc 的训练损失为 inf,而验证损失似乎正常
问题描述
我有一个模型,由 CNN、RNN 和输出层组成。我拥有的数据是图像和它的转录。转录被填充到 9 个字符的长度。对于 CTC 损失,我遵循了 keras ocr 示例代码,如下所示:
class CTCLayer(layers.Layer):
def __init__(self, name=None):
super().__init__(name=name)
self.loss_fn = keras.backend.ctc_batch_cost
def call(self, y_true, y_pred):
batch_len = tf.cast(tf.shape(y_true)[0], dtype="int64")
input_length = tf.cast(tf.shape(y_pred)[1], dtype="int64")
label_length = tf.cast(tf.shape(y_true)[1], dtype="int64")
input_length = input_length * tf.ones(shape=(batch_len, 1), dtype="int64")
label_length = label_length * tf.ones(shape=(batch_len, 1), dtype="int64")
loss = self.loss_fn(y_true, y_pred, input_length, label_length)
self.add_loss(loss)
return y_pred
现在这是我实施它的方式:
#l is the number possible of classes / characters
labels = layers.Input(shape=(9,), dtype="float32")
outputs = layers.Dense(l+1, activation='softmax',name='output')(lstm)
output = CTCLayer()(labels,outputs)
model = Model(inputs = [input_layer,labels],outputs=output)
model = model.compile(optimizer = optimizers.Adam(0.01))
model.fit([x_train,y_train],y_train,validation_split = 0.2, epochs = 100)
一旦运行 model.fit 开始发生一些奇怪的事情,我得到了一个 inf 训练损失,但一个大约 20 的验证损失。我查看了可能导致它的原因并遇到了这篇文章。接受的答案如下:
绝对是导致问题的输入的序列长度。显然,序列长度应该比地面实况长度大一点。
这是什么意思,我需要如何更改我的代码才能解决我遇到的问题?
解决方案
推荐阅读
- javascript - 我从 react native 开始,如何正确安装 yarn?已经尝试过 google 和 YouTube
- ruby-on-rails - 您的 Ruby 版本是 2.7.0,但您的 Gemfile 指定了 3.0.0
- html - 缩进 HTML 元素、同一行还是嵌套元素?
- javascript - Webpack 不允许从 next.js 中的变量导入 es2020
- highcharts - zAxis值为0时如何在highcharts中显示点?
- firebase - 我可以让 logEvent 支持 Firebase 仪表板中显示的推荐事件以进行分析吗?
- c# - WebAPI:在同一条路由上返回通用对象:它是 RESTFUL 吗?
- reactjs - 从 htm5 localstorage 加载获取和过滤的 json
- node.js - NGINX proxy_pass 第二个位置块 504 网关超时
- ms-access - access 2016 中的变量选择语句