如何从 keras 保存 OCR 模型 author-A_K_Nain

how to save ocr model from keras author-A_K_Nain

我正在研究 A_K_Nain 编写的 keras 示例中的 tensorflow ocr 模型。该模型使用自定义对象(CTC 层)。它在站点中:https://keras.io/examples/vision/captcha_ocr/ 我使用我的数据集训练模型,然后预测模型的结果是完美的。 我想保存并加载这个模型,我试过了。但是我遇到了一些错误,所以我在 CTC 层 class.

中附加了这段代码
def get_config(self):
    config = super(CTCLayer, self).get_config()
    config.update({"name":self.name})
    return config

之后 我试图保存整个模型和重量,但没有任何效果。 所以我申请了2个保存点。 第一种方式。

history = model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=70,
    callbacks=[early_stopping],
)

model.save('./model/my_model')

---------------------------------------

new_model = load_model('./model/my_model', custom_objects={'CTCLayer':CTCLayer})

prediction_model = keras.models.Model(
  new_model .get_layer(name='image').input, new_model .get_layer(name='dense2').output
)

第二种方式。

prediction_model = keras.models.Model(
  model.get_layer(name='image').input, model.get_layer(name='dense2').output
)

prediction_model.save('./model/my_model')

这些仍然没有用。它没有出错,但预测结果很糟糕。 当训练和保存和加载一起执行时,可以获得准确的结果。 如果我加载相同的模型而不一起训练,结果会很糟糕。

我怎么能不用每次都训练就使用这个模型呢?请帮助我。

问题不是来自tensorflow。在captcha_ocr教程中,characters是一个集合,集合是无序的。因此,使用 StringLookup 从字符到整数的映射取决于笔记本的当前 运行。这就是为什么在没有重新训练的情况下在另一个笔记本上使用它时会出现垃圾的原因,映射不一样!
一种解决方案是使用有序列表而不是 characters 的集合:

characters = sorted(list(set([char for label in labels for char in label])))

请注意,此处的 set 运算符允许获取每个字符的唯一版本,然后将其转换回列表并排序。然后它将在任何 script/notebook 上工作而无需重新训练(使用相同的公式)。