DL4J:如何解决加载用于手写识别的CRNNtype神经网络的问题?

2024-09-29 00:14:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试训练一个混合打印文本和手写识别的神经网络,目标是在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: Expected model class name Model (found Functional). For more information, see https://deeplearning4j.konduit.ai/keras-import/overview at org.deeplearning4j.nn.modelimport.keras.KerasModel.(KerasModel.java:133) at org.deeplearning4j.nn.modelimport.keras.KerasModel.(KerasModel.java:96) at org.deeplearning4j.nn.modelimport.keras.utils.KerasModelBuilder.buildModel(KerasModelBuilder.java:307) at 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: Error detected in HDF5 (1.12.0) thread 0: #000: H5G.c line 528 in H5Gopen2(): unable to open group major: Symbol table minor: Can't open object #001: H5VLcallback.c line 4186 in H5VL_group_open(): group open failed major: Virtual Object Layer minor: Can't open object #002: H5VLcallback.c line 4153 in H5VL__group_open(): group open failed major: Virtual Object Layer minor: Can't open object #003: H5VLnative_group.c line 125 in H5VL__native_group_open(): unable to open group major: Symbol table minor: Can't open object #004: H5Gint.c line 282 in H5G__open_name(): group not found major: Symbol table minor: Object not found #005: H5Gloc.c line 462 in H5G_loc_find(): can't find object major: Symbol table minor: Object not found #006: H5Gtraverse.c line 855 in H5G_traverse(): internal path traversal failed major: Symbol table minor: Object not found #007: H5Gtraverse.c line 630 in H5G__traverse_real(): traversal operator failed major: Symbol table minor: Callback failed #008: H5Gloc.c line 418 in H5G__loc_find_cb(): object 'model_weights' doesn't exist major: Symbol table minor: Object not found java.lang.RuntimeException: H5Gopen2 failed at org.bytedeco.hdf5.H5Location.openGroup(Native Method) at 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: Cannot assign arrays: arrays must both be scalars, both vectors, or shapes must be equal other than size 1 dimensions. Attempting to do x.assign(y) with x.shape=[20480, 128] and y.shape=[512, 128] Tried to set weights for layer with name dense_in, of class org.deeplearning4j.nn.conf.layers.DenseLayer. Failed to set weights for parameter W Expected shape for this parameter: Rank: 2, DataType: FLOAT, Offset: 0, Order: f, Shape: [20480,128], Stride: [1,20480], got: Rank: 2, DataType: FLOAT, Offset: 0, Order: c, Shape: [512,128], Stride: [128,1]. For more information, see https://deeplearning4j.konduit.ai/keras-import/overview at org.deeplearning4j.nn.modelimport.keras.KerasLayer.copyWeightsToLayer(KerasLayer.java:334) at org.deeplearning4j.nn.modelimport.keras.utils.KerasModelUtils.copyWeightsToModel(KerasModelUtils.java:75)..

我能做些什么让它运行吗


Tags: inorg模型modellinegroupnnjava