0

我正在尝试在 IntelliJ 中设置一个 maven 项目,我需要有关如何设置 deeplearning4j 的完整最新说明,因为我一直遇到以下错误:

java.lang.NoClassDefFoundError: 无法初始化类 org.nd4j.linalg.factory.Nd4j 和 java.lang.ExceptionInInitializerError(这些是我使用 Kotlin REPL 时的情况)。当我正常运行程序时,我也会收到这些警告:log4j:WARN No appenders could be found for logger (org.nd4j.linalg.factory.Nd4jBackend)。

这是我的 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>Test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>org.example Test</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <kotlin.version>1.3.61</kotlin.version>
    <kotlin.code.style>official</kotlin.code.style>
    <junit.version>4.12</junit.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
    <dependency>
        <groupId>org.nd4j</groupId>
        <artifactId>nd4j-common</artifactId>
        <version>1.0.0-beta6</version>
    </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-core</artifactId>
            <version>1.0.0-beta4</version>
        </dependency>
        <dependency>
            <groupId>org.nd4j</groupId>
            <artifactId>nd4j-native-platform</artifactId>
            <version>1.0.0-beta4</version>
        </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.nd4j</groupId>
        <artifactId>nd4j-jblas</artifactId>
        <version>0.0.3.5.5.4-SNAPSHOT</version>
    </dependency>
</dependencies>

<build>
    <sourceDirectory>src/main/kotlin</sourceDirectory>
    <testSourceDirectory>src/test/kotlin</testSourceDirectory>

    <plugins>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>addSources</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这是我的程序(取自 nd4j 示例):

import org.nd4j.linalg.api.ndarray.INDArray
import org.nd4j.linalg.factory.Nd4j
import java.util.*

class Test3
{

}

fun main() { /*
        Before we begin, let's review what an INDArray is:
        A INDArray is a multi-dimensional array of numbers: a vector, matrix, or tensor for example.
        Internally, it may store single precision or double precision floating point values for each entry.
        Here, we'll see how you can get some basic information about INDArrays. In later examples, we'll see
        the different ways to create INDArrays, and more operations we can do on them.
         */
//Let's start by creating a basic 2d array: a matrix with 3 rows and 5 columns. All elements are 0.0
    val nRows = 3
    val nColumns = 5
    val myArray: INDArray = Nd4j.zeros(nRows, nColumns)
    //Next, print some basic information about the array:
    System.out.println("Basic INDArray information:")
    System.out.println("Num. Rows:          " + myArray.rows())
    System.out.println("Num. Columns:       " + myArray.columns())
    System.out.println("Num. Dimensions:    " + myArray.rank()) //2 dimensions -> rank 2
    System.out.println("Shape:              " + Arrays.toString(myArray.shape())) //[3,5] -> 3 rows, 5 columns
    System.out.println("Length:             " + myArray.length()) // 3 rows * 5 columns = 15 total elements
    //We can print the array itself using toString method:
    System.out.println("\nArray Contents:\n$myArray")
    //There are some other ways we can get the same or similar info
    System.out.println()
    System.out.println("size(0) == nRows:   " + myArray.size(0)) //Also equivalent to: .shape()[0]
    System.out.println("size(1) == nCols:   " + myArray.size(1)) //Also equivalent to: .shape()[1]
    System.out.println("Is a vector:        " + myArray.isVector())
    System.out.println("Is a scalar:        " + myArray.isScalar())
    System.out.println("Is a matrix:        " + myArray.isMatrix())
    System.out.println("Is a square matrix: " + myArray.isSquare())
    //Let's make some modifications to our array...
// Note that indexing starts at 0. Thus 0..2 are valid indices for rows, and 0..4 are valid indices for columns here
    myArray.putScalar(0, 1, 2.0) //Set value at row 0, column 1 to value 2.0
    myArray.putScalar(2, 3, 5.0) //Set value at row 2, column 3 to value 5.0
    System.out.println("\nArray after putScalar operations:")
    System.out.println(myArray)
    //We can also get individual values:
    val val0: Double = myArray.getDouble(0, 1) //Get the value at row 0, column 1 - expect value 2.0 as we set this earlier
    System.out.println("\nValue at (0,1):     $val0")
    //Finally, there are many things we can do to the array... for example adding scalars:
    val myArray2: INDArray = myArray.add(1.0) //Add 1.0 to each entry
    System.out.println("\nNew INDArray, after adding 1.0 to each entry:")
    System.out.println(myArray2)
    val myArray3: INDArray = myArray2.mul(2.0) //Multiply each entry by 2.0
    System.out.println("\nNew INDArray, after multiplying each entry by 2.0:")
    System.out.println(myArray3)
}
4

2 回答 2

0

此处提供了完整的安装指南:http: //nd4j.org/getstarted

注意:仅支持 64 位 jdk,不支持 jdk 13,jdk 7 适合我,在 intellij 中启用自动导入模块

于 2020-04-26T18:46:01.163 回答
0

哇,那个 pom.xml 似乎很糟糕。你是从哪里弄来的?

通常您希望所有 DL4J 和 ND4J 依赖项具有相同的版本,但您在这里混合使用。然后,您将多次获得 slf4j-api 依赖项和一个古老版本的 jblas(多年来一直不需要的依赖项)。

看看https://github.com/eclipse/deeplearning4j-examples/blob/master/standalone-sample-project/pom.xml

这个示例 pom.xml 通常保持最新,是一个很好的起点。

于 2020-01-15T11:34:08.113 回答