美文网首页
ND4J/加法与乘法

ND4J/加法与乘法

作者: hello风一样的男子 | 来源:发表于2019-04-03 10:10 被阅读0次
    package org.nd4j.examples;
    
    import org.nd4j.linalg.api.ndarray.INDArray;
    import org.nd4j.linalg.api.ops.impl.transforms.Sin;
    import org.nd4j.linalg.factory.Nd4j;
    import org.nd4j.linalg.ops.transforms.Transforms;
    
    import java.util.Arrays;
    
    /**
     * --- Nd4j示例 4:使用INDArrays的附加操作---
     * 
     *  在这个例子中,我们将看到处理INDArray的方法
     * 
     * @author Alex Black
     */
    public class Nd4jEx4_Ops {
    
        public static void main(String[] args){
    
            /*
            ND4J定义了很多的操作,现在我们来看看如何使用它们中的一些:
            - 元素级别操作:   add, multiply, divide, subtract, 等 add, mul, div, sub,
                INDArray.add(INDArray), INDArray.mul(INDArray), etc
            - 矩阵操作:mmul
            - 行/列向量操作:addRowVector, mulColumnVector, 等
            - 元素级别转换, 如tanh, 标量max操作, 等等
             */
    
            //首先让我们来看看就地操作与拷贝操作对比
            //考虑一下调用:   myArray.add(1.0)对比myArray.addi(1.0)
            //例如, "add" 对比. "addi"   -> "i" 表示应地操作 
            //在实践中:就地操作修改原始数组;其他操作(“拷贝操作”)进行拷贝
            
            
            INDArray originalArray = Nd4j.linspace(1,15,15).reshape('c',3,5);      
            INDArray copyAdd = originalArray.add(1.0);
            System.out.println("由add返回的对象:    " + (originalArray == copyAdd));
            System.out.println("在originalArray.add(1.0)执行之后的原始数组:\n" + originalArray);
            System.out.println("拷贝添加的数组:\n" + copyAdd);
    
            
            
            //让我们对就地添加操作执行相同的操作:
            INDArray inPlaceAdd = originalArray.addi(1.0);
            System.out.println();
            //addi 返回同一个JABA对象 
            System.out.println("由addi返回的对象:    " + (originalArray == inPlaceAdd));   
            System.out.println("originalArray.addi(1.0)操作后返回的原始数组:\n" + originalArray);
            System.out.println("就地添加的数组:\n" + copyAdd);
    
    
          
            //让我们为下一节重新创建原始数组,并创建另一个数组:
            originalArray = Nd4j.linspace(1,15,15).reshape('c',3,5);
            //参见示例2;我们有一个3x5,具有统一的随机(0到1)值
            INDArray random = Nd4j.rand(3,5);               
    
    
    
           
            //我们可以执行元素操作。请注意,数组形状必须在此处匹配
            //对于标量add与addi的工作方式与完全相同
            INDArray added = originalArray.add(random);
            System.out.println("\n\n\n 随机值:\n" + random);
            System.out.println("原始加上随机值:\n" + added);
    
    
            //矩阵操作很容易:
            INDArray first = Nd4j.rand(3,4);
            INDArray second = Nd4j.rand(4,5);
            INDArray mmul = first.mmul(second);
            
            //期望的3x5 输出
            System.out.println("\n\n\n  mmul数组的形状为: " + Arrays.toString(mmul.shape()));    
    
    
         
            //我们可以按行(“每行”)和按列(“每列”)操作
            //同样,inplace与copy操作的工作方式相同(即addRowVector与addiRowVector)
            INDArray row = Nd4j.linspace(0,4,5);
            System.out.println("\n\n\n 行:\n" + row);
            INDArray mulRowVector = originalArray.mulRowVector(row);
            //对于“originalArray”中的每一行,使用行向量执行逐元素乘法
            System.out.println("originalArray.mulRowVector(row)的结果");
            System.out.println(mulRowVector);
    
    
            //元素方向的转换类似于“tanh”和标量max值。这些可以通过几种方式应用:
            System.out.println("\n\n\n");
           
            //同样,请注意打印精度有限,如示例2所示。
            System.out.println("随机数组:\n" + random);     
            System.out.println("元素在随机数组上的tanh转换:\n" + Transforms.tanh(random));
            System.out.println("元素在随机数组上的乘方转换 (x^3.0) :\n" + Transforms.pow(random,3.0));
            System.out.println("元素与标量max操作 (与标量0.5):\n" + Transforms.max(random,0.5));
           
            //我们也可以更详细地执行此操作:
            INDArray sinx = Nd4j.getExecutioner().execAndReturn(new Sin(random.dup()));
            System.out.println("元素sin(x)操作:\n" + sinx);
        }
    }
    
    

    运行结果

    由add返回的对象:    false
    在originalArray.add(1.0)执行之后的原始数组:
    [[    1.0000,    2.0000,    3.0000,    4.0000,    5.0000], 
     [    6.0000,    7.0000,    8.0000,    9.0000,   10.0000], 
     [   11.0000,   12.0000,   13.0000,   14.0000,   15.0000]]
    拷贝添加的数组:
    [[    2.0000,    3.0000,    4.0000,    5.0000,    6.0000], 
     [    7.0000,    8.0000,    9.0000,   10.0000,   11.0000], 
     [   12.0000,   13.0000,   14.0000,   15.0000,   16.0000]]
    
    由addi返回的对象:    true
    originalArray.addi(1.0)操作后返回的原始数组:
    [[    2.0000,    3.0000,    4.0000,    5.0000,    6.0000], 
     [    7.0000,    8.0000,    9.0000,   10.0000,   11.0000], 
     [   12.0000,   13.0000,   14.0000,   15.0000,   16.0000]]
    就地添加的数组:
    [[    2.0000,    3.0000,    4.0000,    5.0000,    6.0000], 
     [    7.0000,    8.0000,    9.0000,   10.0000,   11.0000], 
     [   12.0000,   13.0000,   14.0000,   15.0000,   16.0000]]
    
    
    
     随机值:
    [[    0.0183,    0.7362,    0.4703,    0.9437,    0.5912], 
     [    0.1248,    0.1432,    0.6722,    0.0705,    0.3339], 
     [    0.1951,    0.8349,    0.8127,    0.2331,    0.3958]]
    原始加上随机值:
    [[    1.0183,    2.7362,    3.4703,    4.9437,    5.5912], 
     [    6.1248,    7.1432,    8.6722,    9.0705,   10.3339], 
     [   11.1951,   12.8349,   13.8127,   14.2331,   15.3958]]
    
    
    
      mmul数组的形状为: [3, 5]
    
    
    
     行:
    [[         0,    1.0000,    2.0000,    3.0000,    4.0000]]
    originalArray.mulRowVector(row)的结果
    [[         0,    2.0000,    6.0000,   12.0000,   20.0000], 
     [         0,    7.0000,   16.0000,   27.0000,   40.0000], 
     [         0,   12.0000,   26.0000,   42.0000,   60.0000]]
    
    
    
    
    随机数组:
    [[    0.0183,    0.7362,    0.4703,    0.9437,    0.5912], 
     [    0.1248,    0.1432,    0.6722,    0.0705,    0.3339], 
     [    0.1951,    0.8349,    0.8127,    0.2331,    0.3958]]
    元素在随机数组上的tanh转换:
    [[    0.0183,    0.6268,    0.4384,    0.7369,    0.5307], 
     [    0.1241,    0.1423,    0.5864,    0.0704,    0.3220], 
     [    0.1926,    0.6831,    0.6711,    0.2289,    0.3763]]
    元素在随机数组上的乘方转换 (x^3.0) :
    [[ 6.1052e-6,    0.3990,    0.1040,    0.8403,    0.2066], 
     [    0.0019,    0.0029,    0.3038,    0.0004,    0.0372], 
     [    0.0074,    0.5821,    0.5368,    0.0127,    0.0620]]
    元素与标量max操作 (与标量0.5):
    [[    0.5000,    0.7362,    0.5000,    0.9437,    0.5912], 
     [    0.5000,    0.5000,    0.6722,    0.5000,    0.5000], 
     [    0.5000,    0.8349,    0.8127,    0.5000,    0.5000]]
    元素sin(x)操作:
    [[    0.0183,    0.6715,    0.4531,    0.8097,    0.5573], 
     [    0.1245,    0.1427,    0.6227,    0.0705,    0.3277], 
     [    0.1938,    0.7413,    0.7262,    0.2309,    0.3855]]
    
    

    翻译:风一样的男子

    image

    相关文章

      网友评论

          本文标题:ND4J/加法与乘法

          本文链接:https://www.haomeiwen.com/subject/gnhabqtx.html