zoukankan      html  css  js  c++  java
  • deeplearing4j学习以及踩过的坑

    1. 添加dl4j后, run项目时, 一直run不起来, run按钮绿色但是点击没反应。   查看日志后发现: 是classpath太长导致的。

    在本项目的.idea文件夹,找到文件夹中的workspace.xml文件,   搜索 PropertiesComponent ,  在其下添加一行设置 :  

    <property name="dynamic.classpath" value="true" />
    

      

    2. 当添加nd4j系众多jar包时, 一定会出现依赖冲突的情况, 在Settings-plugins中安装 Maven Helper插件, 找到冲突依赖, 并排除掉。

    ##  学习部分:

    1.RNN网络

    对于RNN网络, 输入模型的数据是三维结构 [样本数,特征值数,时间步]。 就INDArray中的数据布局而言,位于(i,j,k)的值即是一批数据中第i例的第k个时间步的第j个值。

    RnnOutputLayer是在许多循环网络系统(用于回归和分类任务)中使用的最终层。

    掩模: 控制一对一, 一对多, 多对一, 多对多的序列输出。 1:该位置存在输出, 0:该位置无输出。

    RNN可以使用MultiLayerNetwork.output() 和MultiLayerNetwork.feedForward() 方法生成预测。但它们的限制是,在生成时间序列的预测时,每次都只能从头开始运算。

    假设我们需要在一个实时系统中生成基于大量历史数据的预测。在这种情况下,使用output/feedForward方法是不实际的, 比如:

    采用output方法,那么我们需要送入全部100个小时的数据,才能预测出第101个小时的天气。而预测第102个小时的天气时,我们又需要送入100(或101)个小时的数据;第103个小时及之后的预测同理。

    因此有如下解决办法:

    rnnTimeStep(INDArray)方法在被调用时会记录RNN各层的内部状态, 一次只生成一步或数步预测(rnnTimeStep)。

    但如果要开始对一个新的(完全分离的)时间序列进行预测,就必须(这很重要)用MultiLayerNetwork.rnnClearPreviousState()方法手动清除已存储的状态。该方法将会重置网络中所有循环层的内部状态。

    如果需要存储或设置RNN的内部状态以用于预测,可以对每一层分别使用rnnGetPreviousState和rnnSetPreviousState方法。这适用于例如序列化(网络保存/加载)等情况,因为由rnnTimeStep方法产生的内部网络状态默认不会保存,必须另外保存和读取。

    ## NDArrays学习:

    Physically, the data that backs an INDArray is stored off-heap: that is, it is stored outside of the Java Virtual Machine (JVM).  因此不会收到java数字长度的限制,以及计算时超出内存的影响。

    INDArray out = myMatrix.transpose().dup()   dup()方法是深度复制, 不会影响到源矩阵或向量。

    myArray.getRow(0).addi(1.0)         myArray.putRow(int rowIdx,INDArray row)

    使用java数组创建向量:

    创建1维向量:  Nd4j.create(float[])

    创建2维向量: Nd4j.create(float[][])

    创建3维向量: 

    myDoubleArray = double[][][]
    
    double[] flat = ArrayUtil.flattenDoubleArray(myDoubleArray)
    int[] shape = ...;
    INDArray myArr = Nd4j.create(flat,shape,'c');
    

      

    按行拼接两个向量:  Nd4j.hstack()

    按列拼接两个向量:  Nd4j.vstack()

    取得向量中的值: INDArray.getDouble(i,j,k)

    设置向量中的值: INDArray.putScalar(int[], double)

    [ rowIdx, : ]     myArray.get(NDArrayIndex.point(rowIdx), NDArrayIndex.all())

    [ a:b, : ]           myArray.get(NDArrayIndex.interval(a,b), NDArrayIndex.all())

    myArray.get(NDArrayIndex.all(),NDArrayIndex.interval(0,2,nCols))

    INDArray.put(INDArrayIndex[], INDArray toPut)

    add() 与 addi() 的区别:   addi 将原始向量的引用做为输出引用,   add不会改变原始值, 而是另外申请一个内存空间存放结果。

  • 相关阅读:
    虚函数表
    写出float x 与“零值”比较的if语句
    系统表的构成
    UEFI的inf文件构成
    最短路径算法
    EDK2与EDK2工具链关系图
    GIT提交本地文件
    docker学习笔记-04:docker容器数据卷
    docker学习笔记-03:docker的镜像原理
    docker学习笔记-02:docker常用命令
  • 原文地址:https://www.cnblogs.com/ruili07/p/10354710.html
Copyright © 2011-2022 走看看