微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DL4J:如何解决加载 CRNN 类型的神经网络进行手写识别的问题?

如何解决DL4J:如何解决加载 CRNN 类型的神经网络进行手写识别的问题?

我正在尝试训练用于混合印刷文本和手写识别的神经网络,目标是在 Java 应用程序中使用 DL4J 加载模型。我能够成功地训练一个可以读取单个数字和字母的简单网络,但遇到了我必须将符号彼此隔离的问题。我发现以下文本建议训练 CRNN 来完成所有工作:https://towardsdatascience.com/build-a-handwritten-text-recognition-system-using-tensorflow-2326a3487cd5

该项目依赖于另一个 Git-repo,它可以生成带有文本的图像。为方便起见,我将两个项目合并为一个方法是将生成器的必要文件夹复制过来,然后删除一些特定于 GPU 的东西(这里没有这样的硬件)。好的,手写仍然存在问题,但我相信这只是因为生成器有时会创建空图像(在某处声明此功能是实验性的)。一次只有一个不可能解决的问题,船长说,所以我暂时把模型限制在打印的字母上,这确实有效。

接下来,我想在 Java 程序中使用 DL4J 加载该模型,但我失败了。只要我使用 Tensorflow 2.3.0 进行 Python 训练,DL4J 就会向我抛出如下异常:

org.deeplearning4j.nn.modelimport.keras.exceptions.InvalidKerasConfigurationException:预期的模型类名称模型(发现功能)。如需更多信息,请参阅https://deeplearning4j.konduit.ai/keras-import/overview 在 org.deeplearning4j.nn.modelimport.keras.KerasModel.(KerasModel.java:133) 在 org.deeplearning4j.nn.modelimport.keras.KerasModel.(KerasModel.java:96) 在 org.deeplearning4j.nn.modelimport.keras.utils.KerasModelBuilder.buildModel(KerasModelBuilder.java:307) 在 main.LetterFixerTests.tryRNN(LetterFixerTests.java:769) ...

我在某处读到,文件格式同时发生了变化,所以我降级到 Tensorflow 2.2.0 并且提到的异常消失了。不幸的是,我得到了另一个例外,这意味着模型中不能省略高度,尽管这对我的目的很有用,因为我的文本长度可能会有所不同。我发现可以通过在加载期间将形状传递给模型来加载模型,因此我目前正在加载如下:

        KerasModel model = new KerasModel().modelBuilder()
                //.modelHdf5Filename(pathModelFull.toString())
                .modelJsonFilename(pathModel.toString())
                .weightsHdf5Filename(pathWeights.toString())
                .inputShape(inputShape)
                .enforceTrainingConfig(false)
                .buildModel();

        computationGraph graph = model.getcomputationGraph();

然后我会使用图像形状再次为任何新图像重新加载模型。不过,我在加载时收到错误

HDF5-DIAG:在 HDF5 (1.12.0) 线程 0 中检测到错误: #000:H5Gopen2() 中的 H5G.c 第 528 行:无法打开组 专业:符号表 次要:无法打开对象 #001: H5VL_group_open() 中的 H5VLcallback.c 第 4186 行:组打开失败 专业:虚拟对象层 次要:无法打开对象 #002: H5VLcallback.c 第 4153 行在 H5VL__group_open(): 组打开失败 专业:虚拟对象层 次要:无法打开对象 #003:H5VLnative_group.c 第 125 行 H5VL__native_group_open():无法打开组 专业:符号表 次要:无法打开对象 #004:H5G__open_name() 中的 H5Gint.c 第 282 行:未找到组 专业:符号表 次要:未找到对象 #005: H5G_loc_find() 中的 H5Gloc.c 第 462 行:找不到对象 专业:符号表 次要:未找到对象 #006: H5G_traverse() 中的 H5Gtraverse.c 第 855 行:内部路径遍历失败 专业:符号表 次要:未找到对象 #007:H5G__traverse_real() 中的 H5Gtraverse.c 第 630 行:遍历运算符失败 专业:符号表 次要:回调失败 #008: H5G__loc_find_cb() 中的 H5Gloc.c 第 418 行:对象“model_weights”不存在 专业:符号表 次要:未找到对象 java.lang.RuntimeException: H5Gopen2 失败 在 org.bytedeco.hdf5.H5Location.openGroup(本机方法) 在 org.deeplearning4j.nn.modelimport.keras.Hdf5Archive.openGroups(Hdf5Archive.java:85)..

似乎这与权重有关,而可以加载 JSON。我还试验了一个包含 JSON 和权重的完整模型,这是存储模型的 Python 代码

model.load_weights('./saved_models/weights.h5')

model.save('./saved_models/full_model.h5')

model_json = model.to_json()
with open("./saved_models/model_config.json","w") as f:
    f.write(model_json)

model.save_weights('./saved_models/model_weights.h5')

但是,我仍然有例外:

org.deeplearning4j.nn.modelimport.keras.exceptions.InvalidKerasConfigurationException:无法分配数组:数组必须都是标量、两个向量或形状必须相等,但尺寸不为 1 维。尝试使用 x.shape=[20480,128] 和 y.shape=[512,128] 执行 x.assign(y) 尝试为类 org.deeplearning4j.nn.conf.layers.DenseLayer 的名为密集层的层设置权重。 未能为参数 W 设置权重 此参数的预期形状:等级:2,数据类型:FLOAT,偏移量:0,顺序:f,形状:[20480,128],步幅:[1,20480], 得到:等级:2,数据类型:FLOAT,偏移量:0,顺序:c,形状:[512,128],步幅:[128,1]。如需更多信息,请参阅https://deeplearning4j.konduit.ai/keras-import/overview 在 org.deeplearning4j.nn.modelimport.keras.KerasLayer.copyWeightsToLayer(KerasLayer.java:334) 在 org.deeplearning4j.nn.modelimport.keras.utils.KerasModelUtils.copyWeightsToModel(KerasModelUtils.java:75)..

我能做些什么来让它运行吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。