我正在为应用于colab中Kaggle的单词mnist数据集的OCR模型工作。A_K_Nain在网站上托管的Keras示例中编写的具有LSTM和CTC层的ocr captcha模型启发了我:https://keras.io/examples/vision/captcha_ocr/我本来想保存这个模型,但当我试图加载它来对看不见的数据进行预测时。我得到了一个未知CTClaier的错误。ctclayer的问题不是在模型内部定义的,而是在模型外部定义的,所以当我试图加载模型时,我发现了错误。我找到了一个使用自定义模型的解决方案,但对我来说什么都不管用。如何保存以下网站中托管的模型:https://keras.io/examples/vision/captcha_ocr/
CTC层不用于进行预测,因此您可以在没有CTC层的情况下保存,如下所示:-
saving_model = keras.models.Model(model.get_layer(name="image").input, model.get_layer(name="dense2").output
)
saving_model.summary()
saving_model.save("model_tf")
除此之外,您必须进行一些更改才能使此代码在变量中工作:-
max_length = max([len(label) for label in labels])
outfile = open("max_length",'wb')
pickle.dump(max_length,outfile)
outfile.close()
import string
chars = string.printable
chars = chars[:-5]
characters = [c for c in chars]
这将给出一组定义的字符,这将有助于预测,因此在预测部分,你必须做:-
infile = open("max_length",'rb')
max_length = pickle.load(infile)
infile.close()
import string
chars = string.printable
chars = chars[:-5]
characters = [c for c in chars]
# Mapping characters to integers
char_to_num = layers.experimental.preprocessing.StringLookup(
vocabulary=characters, mask_token=None
)
# Mapping integers back to original characters
num_to_char = layers.experimental.preprocessing.StringLookup(
vocabulary=char_to_num.get_vocabulary(), mask_token=None, invert=True
)
prediction_model = tf.keras.models.load_model('model_tf')
然后继续。
以下是如何使用作者A_K_Nain代码预测新图像。从同一代码加载相关函数。
test_img_path =['/path/to/test/image/117011.png']
validation_dataset = tf.data.Dataset.from_tensor_slices((test_img_path[0:1], ['']))
validation_dataset = (
validation_dataset.map(
encode_single_sample, num_parallel_calls=tf.data.experimental.AUTOTUNE
)
.batch(batch_size)
.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
)
for batch in validation_dataset.take(1):
#print(batch['image'])
preds = reconstructed_model.predict(batch['image']) # reconstructed_model is saved trained model
pred_texts = decode_batch_predictions(preds)
print(pred_texts)