ND4J的基本操做

1、ND4J的在內存中的存儲結構數組

    對於ND4J而言,全部的數據都存儲在堆外內存,是一維的連續內存,INDArray 只是指向了這片連續的內存空間,把連續內存映射成張量,ND4J定義了兩種排序規則:C order和F order,C order表示行優先,F order表示列優先。下圖展現了ND4J的內存存儲。函數

C vs. F order

    上圖能夠看出,不過張量是幾維,對應的物理存儲都是一維的連續內存空間,NDArray在指向這片連續的地址,這正是ND4J強大的地方,對於各類矩陣操做,例如:矩陣轉置、矩陣加標量等等操做,均可以垂手可得的實現,而不用花力氣去dup一個巨型數組,高性能也表如今這種優雅的設計方式上。性能

2、ND4J的基本操做單元測試

    一、加法測試

    INDArray add(INDArray other)  :元素對應相加,返回的張量是拷貝出來的設計

    INDArray addi(INDArray other) :元素對應相加,與上面不一樣的是,返回值不是拷貝出來的新數組,而是用計算結果替換原內存數據blog

    INDArray add(Number n):每一個元素加上一個標量排序

    INDArray addi(Number n):每一個元素加上一個標量,並覆蓋原數組內存

    二、減法element

     INDArray sub(Number n):每一個元素減去一個標量

    INDArray subi(Number n):每一個元素減去標量,並覆蓋原數組

    INDArray sub(INDArray other):對應元素相減

     INDArray subi(INDArray other):對應元素相減,並覆蓋原數組

    三、乘法

    乘法分兩種,對應元素相乘和矩陣乘法

    INDArray mul(INDArray other):對應元素相乘

    INDArray muli(INDArray other):對應元素相乘,並覆蓋原數組

     INDArray mmul(INDArray other):矩陣相乘

    INDArray mmuli(INDArray other):矩陣相乘,並覆蓋原數組

    四、除法

    INDArray div(INDArray other):對應元素相除

    INDArray divi(INDArray other):對應元素相除並覆蓋原數組

    INDArray div(Number n):每一個元素除以一個標量

    INDArray divi(Number n):每一個元素除以一個標量,並覆蓋原數組

    五、矩陣轉置

     INDArray transpose()

    INDArray transposei()

    總結一下:後面以i結尾的方法,表示in place,也就是會覆蓋原內存空間的數據,和」傳引用「一個意思

    六、張量建立

    Nd4j類中定義了不少靜態方法,用於建立N維張量,用法例如: Nd4j.zeros(nRows, nColumns)

    public static INDArray zeros(int rows, int columns) :建立一個所有元素爲0的張量

     public static INDArray ones(int rows, int columns) :建立一個所有元素爲1的張量

    public static INDArray hstack(INDArray... arrs):沿着水平方向接起多個矩陣,矩陣必須有相同的行

    public static INDArray vstack(INDArray... arrs):沿着垂直方向接起多個矩陣,矩陣必須有相同的列

     public static INDArray rand(int rows, int columns):隨機對應形狀的張量

    public static INDArray rand(int[] shape):隨機對應形狀的張量

    七、張量設置值

    INDArray putScalar(int[] i, double value):對應位置設置標量

    INDArray putScalar(int row, int col, double value):對應行列處設置標量

    INDArray put(INDArrayIndex[] indices, INDArray element):對應維度處設置INDArray

    八、其餘操做

    INDArray reshape(int... newShape):從新定義張量形狀

    這裏只是列舉了ND4J的一些經常使用操做,ND4J還定義了不少對應張量靈活的操做,例如求和、求平均、求最大值、求最小值、BooleanIndexing根據條件替換張量值、經常使用函數操做(sigmoid、tanh等等),要了解更多的詳情,能夠深刻去看DL4J的example或者單元測試,去體驗這個優秀的張量運算庫。

---------------------------------------------------------------------------------------------------------

快樂源於分享。

此博客乃做者原創, 轉載請註明出處

相關文章
相關標籤/搜索