【问题标题】:Problems with loading nlp model with deeplearning4j使用 deeplearning4j 加载 nlp 模型的问题
【发布时间】:2016-09-15 07:37:03
【问题描述】:

所以我正在尝试为 Java 实现一个名为 deeplearning4j 的免费深度学习库,以解决 nlp 中的分类任务。

public static void Learn(String labelledDataFileName) throws Exception {
    ParagraphVectors paragraphVectors = new ParagraphVectors();
    InMemoryLookupCache cache = new InMemoryLookupCache();
    LabelleDataIterator iterator = new LabelleDataIterator(new File(labelledDataFileName));
    TokenizerFactory t = new DefaultTokenizerFactory();
    t.setTokenPreProcessor(new CommonPreprocessor());
    paragraphVectors = new ParagraphVectors.Builder()
            .minWordFrequency(1)
            .iterations(3)
            .learningRate(0.025)
            .minLearningRate(0.001)
            .layerSize(400)
            .batchSize(1000)
            .epochs(1)
            .iterate(iterator)
            .trainWordVectors(true)
            .vocabCache(cache)
            .tokenizerFactory(t)
            .build();
    paragraphVectors.fit();
    WordVectorSerializer.writeFullModel(paragraphVectors, MODEL_FILE_NAME);
}

相当标准,与网上提供的样品差别不大。然后使用 writeFullModel 方法将拟合后的训练模型保存到文本文件中。然后就可以用这个方法加载了

WordVectorSerializer.loadFullModel(MODEL_FILE_NAME);

问题是,当模型变大时,它似乎不起作用。对于大小为 120Mb 的模型文件,我不断得到这个

Exception in thread "main" java.lang.IllegalArgumentException: Illegal slice 7151
at org.nd4j.linalg.api.ndarray.BaseNDArray.slice(BaseNDArray.java:2852)
at org.nd4j.linalg.api.ndarray.BaseNDArray.tensorAlongDimension(BaseNDArray.java:753)
at org.nd4j.linalg.api.ndarray.BaseNDArray.vectorAlongDimension(BaseNDArray.java:830)
at org.nd4j.linalg.api.ndarray.BaseNDArray.getRow(BaseNDArray.java:3628)
at org.deeplearning4j.models.embeddings.loader.WordVectorSerializer.loadFullModel(WordVectorSerializer.java:523)

虽然模型文件很小,但它可以很好地加载。 任何帮助将不胜感激,非常感谢。

【问题讨论】:

标签: java nlp deep-learning deeplearning4j


【解决方案1】:

当抛出 IllegalArgumentException 时,您必须检查 Java 堆栈跟踪中的调用堆栈并找到产生错误参数的方法。

Here 是 BaseNDArray.java 类,请查看行或搜索出现错误的方法! 看这个方法:

public INDArray slice(int slice) {
    int slices = slices();
    if(slice >= slices)
        throw new IllegalArgumentException("Illegal slice " + slice);

所以,对于 120MB 的文件,切片 >= 切片! 看看这是否可以帮助并回复您是如何解决问题的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多