8

我尝试在 DL4J 上执行以下示例(加载预训练的向量文件):

File gModel = new File("./GoogleNews-vectors-negative300.bin.gz");

Word2Vec vec = WordVectorSerializer.loadGoogleModel(gModel, true);

InputStreamReader r = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(r);

for (; ; ) {
    System.out.print("Word: ");
    String word = br.readLine();

    if ("EXIT".equals(word)) break;

    Collection<String> lst = vec.wordsNearest(word, 20);

    System.out.println(word + " -> " + lst);
}

但它非常慢(尽管它们是正确的,但需要大约 10 分钟来计算最近的单词)。

有足够的内存 ( -Xms20g -Xmx20g)。

当我从https://code.google.com/p/word2vec/运行相同的 Word2Vec 示例时

它很快就给出了最接近的词。

DL4J 使用声称比 Numpy 快两倍的 ND4J:http: //nd4j.org/benchmarking

我的代码有什么问题吗?

更新:它基于https://github.com/deeplearning4j/dl4j-0.4-examples.git(我没有触及任何依赖项,只是尝试阅读 Google 预训练向量文件)。Word2VecRawTextExample 工作得很好(但数据量相对较小)。

4

2 回答 2

0

为了提高性能,我建议您执行以下操作:

  1. 设置环境变量 OMP_NUM_THREADS 等于你的逻辑核心数

  2. 如果您使用 Intel 处理器,请安装 Intel Math Kernel Library

  3. 在您的路径中添加来自英特尔数学核心库的 mkl_intel_thread.dll 所在位置的信息
于 2017-11-21T12:01:00.920 回答
0

这篇文章真的很老了,但现在应该已经改进了很多。我已经在生产中使用 Word2vec 模型运行 DL4J,具有以下设置 @ JVM 级别,它可以在 t2.large 盒子上运行,具有 8G RAM 及以上

java -Xmx2G -Dorg.bytedeco.javacpp.maxbytes=6G -Dorg.bytedeco.javacpp.maxphysicalbytes=6G

此外,我没有使用 wordsNearest() 方法,因为它具有预先计算语料库嵌入的限制,而不是编写我自己的执行亚毫秒响应的余弦相似度。

该博客文章在这里

https://medium.com/sumvit/building-text-similarity-system-from-ground-up-using-word2vec-and-deeplearning4j-dece9ae4e433

如果您想知道如何构建最近的单词或任何其他应用程序,例如文本相似性(相同的基本原理)

于 2019-11-22T03:42:22.477 回答