Eclipse Deeplearning4j的每个版本都有新的变化。
内容
添加了模型服务器-使用JSON或(可选)二进制序列化对SameDiff和DL4J模型进行远程推理
服务器: 查看 JsonModelServer
客户端: 查看 JsonRemoteInference
增加了Scala 2.12支持,删除了Scala2.10支持。具有Scala依赖关系的模块现在随Scala 2.11和2.12版本一起发布。
Apache Spark 1.x 支持删除 (现在只支持 Spark 2.x ). Note注意: Spark 删除了版本后缀 用于升级: 1.0.0-beta4_spark2 -> 1.0.0-beta5
添加FastText 支持到 deeplearning4j-nlp
CUDA支持所有ND4J/SameDiff操作
在1.0.0-beta4中,有些操作仅限于CPU。现在,所有的操作都有完整的CUDA支持
在ND4J(和DL4J/SameDiff)中添加了对新数据类型的支持:BFLOAT16、UINT16、UINT32、UINT64
ND4J: 隐式广播支持添加到 INDArray (已经出现在SameDiff - 例如形状 [3,1]+[3,2]=[3,2]
)
CUDA 9.2, 10.0 与 10.1-Update2 仍然支持
注意: 对于 CUDA 10.1, CUDA 10.1 update 2是推荐的。 CUDA 10.1 与 10.1 Update 1仍将运行,但在某些系统上的多线程代码中可能会遇到罕见的内部cuBLAS问题
依赖项升级: Jackson (2.5.1 to 2.9.9/2.9.9.3), Commons Compress (1.16.1 to 1.18), Play Framework (2.4.8 to 2.7.3), Guava: (20.0 to 28.0-jre, 并遮挡以避免依赖关系冲突)
CUDA: 现在,除了设备(GPU)缓冲区之外,主机(RAM)缓冲区只在需要时分配(以前:主机缓冲区总是被分配的)
添加了FastText-推理和训练,包括OOV(词汇表外)支持(链接)
Scala 2.12 支持添加, Scala 2.10支持删除 (链接)
添加模型服务器(DL4J 与 SameDiff 模型, JSON 与二进制通信) - JsonModelServer, JsonRemoteInference, 链接,链接
添加了保存的模型格式验证实用程序 - DL4JModelValidator, DL4JKerasModelValidator (链接)
添加LabelLastTimeStepPreProcessor (链接)
BertIterator: 添加了将令牌前置到输出的选项(例如某些模型所期望的[cls])(链接)
在多层网络和计算图中添加跟踪级日志记录有助于调试某些问题(链接)
Upsampling3D: 添加 NDHWC 支持 (链接)
MergeVertex 现在支持广播 (链接)
LSTM 与 Dropout现在将依赖于内置实现,如果从cuDNN中遇到异常 (与 Subsampling/ConvolutionLayer一样 ) (链接)
更新的deeplearning4j-ui界面主题(Link)
修复了MergeVertex和CNN3D激活的问题 (Link)
修复Yolo2OutputLayer builder/configuration 方法名中排版错误 (Link)
改进计算图构建器输入类型验证(Link)
移除dl4j-spark-ml模块,直到它可以被适当的维护 (Link)
修复了BertWordPieceTokenizerFactory和错误字符编码的问题 (Link)
修复了从环境变量设置SharedTrainingMaster控制器地址时出现的问题 (Link)
修复了在某些情况下SameDiffOutputLayer初始化的问题 (Link)
修复了上采样层内存报告可能产生OOM异常的问题 (Link)
改进了RecordReaderDataSetIterator的UX/验证 (Link)
修正了EmbeddingSequenceLayer不检查掩码数组数据类型的问题 (Link)
使用非rank-2(shape[1,numParams])数组初始化网络时的验证改进 (Link)
修正了BertIterator的数据类型问题 (Link)
修正了Word2Vec模型向后兼容(beta3和早期的模型现在可以再次加载)Link
修复了某些Keras导入模型可能会失败的问题Could not read abnormally long HDF5 attribute
(Link)
为RnnOutputLayer特征/标签数组长度添加了验证 (Link)
修复了SameDiffOutputLayer不支持变量minibatch大小的问题 (Link)
修复了DL4J SameDiff 层掩码支持 (Link)
DL4J UI: 修复了一个罕见的UI线程问题 (Link)
修复了JSON格式更改时的Keras导入问题 (Link)
修复了Keras导入问题,其中更新程序学习速率调度可能被错误导入(Link)
对DL4J SameDiff层的修复和优化 (Link)
如果在工作区关闭期间发生第二个异常,多层网络/计算图现在将记录原始异常,而不是将其吞入(推理/拟合操作try/finally块) (Link)
更新依赖: Jackson (2.5.1 to 2.9.9/2.9.9.3), Commons Compress (1.16.1 to 1.18), Play Framework (2.4.8 to 2.7.3), Guava: (20.0 to 28.0-jre, 并遮挡以避免依赖关系冲突) (Link)
现在可以为DL4J UI配置日志框架(由于Play framework依赖项升级) (Link)
MnistDataFetcher产生的垃圾量减少(影响MNIST和EMNIST DataSetIterators) (Link)
DL4J AsyncDataSetIterator 和 AsyncMultiDataSetIterator移到了 ND4J, 使用 org.nd4j.linalg.dataset.Async(Multi)DataSetIterator
替换原来的
无法再加载从1.0.0-alpha及以前版本中保存的具有自定义图层的模型。解决方法:加载1.0.0-beta4,然后重新保存模型(链接)。没有自定义层的模型仍然可以加载回0.5.0
Apache Spark 1.x 支持被删除( 现在只有 Spark 2.x 被支持). 注意:Spark版本后缀已删除:对于升级,请按如下方式更改版本: 1.0.0-beta4_spark2 -> 1.0.0-beta5
Scala 2.10 被删除, Scala 2.12 被添加 (对于具有Scala依赖项的模块)
由于添加了同步,某些层(如LSTM)在不使用cuDNN时在CUDA的1.0.0-beta5上可能比1.0.0-beta4上运行得慢。此同步将在1.0.0-beta5之后的下一个版本中删除
CUDA 10.1:在运行cuda10.1 update 1(可能还有10.1)时,在某些系统上的多线程代码中可能会遇到罕见的内部cuBLAS问题。建议使用CUDA 10.1 update2。
添加新数据类型: BFLOAT16, UINT16, UINT32, UINT64 (Link)
添加了模型服务器(DL4J和SameDiff模型、JSON和二进制通信)- JsonModelServer, JsonRemoteInference, Link, Link
添加了对形状为零的空数组的支持,以与TensorFlow导入兼容 (Link)
CUDA:现在,除了设备(GPU)缓冲区外,主机(RAM)缓冲区只在需要时分配(以前:总是分配主机缓冲区)
改进的SameDiff训练API-添加了“在线”测试集评估、返回带有损失曲线的历史对象等 (Link)
添加了保存的模型格式验证实用程序 - Nd4jValidator, Nd4jCommonValidator (Link)
添加SameDiff.convertDataTypes 方法,用于变量dtype转换 (Link)
添加crop 与 resize 操作 (Link)
DL4J AsyncDataSetIterator 与 AsyncMultiDataSetIterator 迁移到 ND4J Link
添加 basic/MVP SameDiff UI listener (Link)
添加 SameDiff名称作用域 (Link)
SameDiff: 更新器 状态和训练配置现在写入FlatBuffers格式 (Link)
添加了可从Java调用的c++基准测试套件
Nd4j.getExecutioner().runLightBenchmarkSuit()
与 Nd4j.getExecutioner().runFullBenchmarkSuit()
(Link)
为评估实例的添加轴配置 (Evaluation, RegressionEvaluation, ROC, etc - getAxis 与 setAxis 方法) 来允许不同的数据格式 (NCHW vs. 用于CNNs的NHWC, 例如 ) (Link)
SameDiff: 添加了将常量转换为占位符的支持, 通过 SDVariable.convertToConstant() 方法 (Link)
SameDiff: 为 SameDiff添加了GradCheckUtil.checkActivationGradients方法来检查激活梯度(不仅仅是在现有的梯度检查方法中的参数梯度) (Link)
添加CheckNumerics 操作 (Link)
添加 FakeQuantWithMinMaxArgs 与 FakeQuantWithMinMaxVars 操作 (Link)
添加了带“keep dimensions”选项的INDArray缩减方法-例如,INDArray.mean(boloean, int... dimension)
(Link)
添加了INDArray.toString(NDArrayStrings options)、toStringFull()和toString方法重载,以便更轻松地控制数组打印(Link)
添加 HashCode 操作, INDArray.hashCode() (Link)
SameDiff: 为 loops/conditional 操作添加 whileLoop,ifCond方法 (Link)
deeplearning4j-nlp: 重命名 AggregatingSentencePreProcessor 为 sentencePreProcessor method (Link)
升级 Protobuf 版本 - 3.5.1 到 3.8.0 (Link)
为 libnd4j 本地操作切换c=style错误处理(Link)
更新到JavaCPP/JavaCV 1.5.1-1 (Link)
SameDiff: 现在只有在需要计算请求的变量时,才必须提供占位符(Link)
SameDiff: 修正了重复变量名验证的问题 (Link)
SameDiff: 修复了标量的SDVariable.getArr问题 (Link)
向DeviceLocalNDArray添加了延迟模式(需要时才复制到设备) (Link)
ND4J: 修复了以numpy.npy格式写入0d(标量)NDArrays的问题(Link)
修复了一些固定情况下Pad操作的问题 (Link)
SameDiff: 修复了某些使用ND4J默认数据类型的操作的DataType推理问题(Link)
INDArray.castTo(DataType) 当数组已经是正确的类型时,现在是no-op (Link)
SameDiff: 修复了训练混合精度网络的问题(Link)
修复了Evaluation类错误地报告二进制情况下macro-averaged精度的问题 (Link)
从 SameDiff TrainingConfig (不再需要)移除 trainableParams config/field (Link)
修复当[1,N] 与 [N,1]时INDArray.isMatrix() 不被认为是矩阵的问题 (Link)
修复INDArray.median(int... dimension) 的问题(Link)
修复当执行收集操作backprop 可能发生无指针异常(Link)
修复 LogSumExp操作Java/C++映射的问题 (Link)
在读取Numpy.npy文件时添加了头验证,以确保文件有效 (Link)
修复了在CUDA上读取Numpy.npy文件时可能出现的问题(Link)
修复了读取Numpy.npy布尔文件时出现的问题(Link)
TensorFlow导入的各种问题修复 (Link)
修复了少数Nd4j.create方法不创建与java原始类型对应的数组的问题 (Link)
一些Nd4j.create方法的形状验证改进 (Link)
清理了未维护的Nd4j.createSparse方法 (Link)
修复了带有CC 3.0的CUDA GPU的CUDA问题 (Link)
修复了c++代码中一些可能的整数溢出(Link)
修正了一些jvm可能由于SameDiff依赖关系(现在已删除)而警告“非法反射访问”的问题(Link)
SDVariable现在不再扩展DifferentialFunction(Link)
将数个操作calculateOutputShape的实例从Java迁移到C++ (Link)
修复了maxpool2d_bp在存在NaN值时引发异常的问题(Link)
修复了空形状(带零)连接的问题 (Link)
删除 INDArray.javaTensorAlongDimension (Link)
LayerNorm 操作现在支持axis参数, NCHW 格式数据 (Link)
libnd4j:由于cuBLAS的限制,cuBLAS hgemm(FP16 gemm)仅对计算能力大于等于5.3的设备调用(Link)
Nd4j.readNumpy 优化 (Link)
在c语言的ELU和lrelu-bp操作中添加了可配置的alpha参数++ (Link)
OldAddOp, OldSubOp, 等被删除 : 用 AddOp, SubOp, 等操作
Nd4j.trueScalar 与 trueVector 被删除 ; 使用 Nd4j.scalar 和 Nd4j.createFromArray 方法
INDArray.javaTensorAlongDimension 被删除 ; 用 INDArray.tensorAlongDimension 代替它
INDArray.lengthLong() 被删除 ; 使用 INDArray.length() 代替它
nd4j-native 在一些 OSX 系统上会出现这样的错误 Symbol not found: ___emutls_get_address
- 查看此链接
SBT1.3.0可能失败,Illegal character in path;SBT1.2.8可以。这是SBT问题,不是ND4J问题。有关详细信息,请参阅此链接
修复了HistoryProcessor的压缩问题 (Link)
Jackson版本的升级需要更改通用对象序列化的执行方式;存储在1.0.0-beta4或更早格式中的Arbiter JSON数据在1.0.0-beta5中可能不可读取。(链接)
主要亮点:对ND4J和DL4J的完全多数据类型支持。在过去的版本中,ND4J中的所有N维数组都被限制为单个数据类型(float或double),全局设置。现在,所有数据类型的数组都可以同时使用。支持以下数据类型:
DOUBLE: 双精度浮点,64位 (8 字节)
FLOAT: 单精度浮点,32位 (4 字节)
HALF: 半精度浮点,16位(2字节), "FP16"
LONG: 长有符号整数,64位(8字节)
INT: 有符号整数,32位(4字节)
SHORT: 有符号短整数,16位(2字节)
UBYTE: 无符号字节,8位(1字节),0到255
BYTE: 有符号字节,8位(1字节),-128至127
BOOL: 布尔类型,(0/1,真/假)。使用ubyte存储以便于操作并行化
UTF8: 字符串数组类型,UTF8格式
ND4J 行为变化:
从Java原生数组创建INDArray时,INDArray数据类型将由原生数组类型确定(除非指定了数据类型)
例如:Nd4j.createFromArray(double[])->double数据类型INDArray
类似地,Nd4j.scalar(1)、Nd4j.scalar(1L)、Nd4j.scalar(1.0)和Nd4j.scalar(1.0f)将分别生成INT、LONG、DOUBLE和FLOAT类型的标量INDArray
某些操作要求操作数具有匹配的数据类型
例如,如果x和y是不同的数据类型,则可能需要强制转换: x.add(y.castTo(x.dataType()))
有些操作有数据类型限制:例如,不支持UTF8数组上的sum,BOOL数组上的variance也不受支持。对于布尔数组(如sum)上的某些操作,首先强制转换为整数或浮点类型可能是有意义的。
DL4J 行为变化:
MultiLayerNetwork/ComputationGraph 不再以任何方式依赖于ND4J全局数据类型。
网络的数据类型(用于参数和激活的数据类型)可以在构建期间设置, 使用 NeuralNetConfigutation.Builder().dataType(DataType)
方法
网络可以从一种类型转换为另一种类型(双精度到浮点,浮点到半精度等)使用 MultiLayerNetwork/ComputationGraph.convertDataType(DataType)
方法
主要新方法:
Nd4j.create(), zeros(), ones(), linspace(), 等带有DataType参数的方法
INDArray.castTo(DataType) 方法 - 将INDArrays从一种数据类型转换为另一种数据类型
新 Nd4j.createFromArray(...) 方法
ND4J/DL4J: CUDA - 10.1 支持添加, CUDA 9.0 支持删除
1.0.0-beta4支持的CUDA版本: CUDA 9.2, 10.0, 10.1.
ND4J: Mac/OSX CUDA 支持被删除
不再提供Mac(OSX)CUDA二进制文件。Linux(x86_64,ppc64le)和Windows(x86_64)CUDA支持仍然存在。OSX CPU支持(x86_64)仍然可用。
DL4J/ND4J: MKL-DNN 支持被添加 在CPU/本机后端上运行时,默认情况下,DL4J(和ND4J conv2d等操作)现在支持MKL-DNN。MKL-DNN支持针对以下层类型实现:
ConvolutionLayer 与 Convolution1DLayer (与 Conv2D/Conv2DDerivative ND4J 操作)
SubsamplingLayer 与 Subsampling1DLayer (与 MaxPooling2D/AvgPooling2D/Pooling2DDerivative ND4J 操作 )
BatchNormalization 层 (与 BatchNorm ND4J op)
LocalResponseNormalization 层 (与 LocalResponseNormalization ND4J 操作 )
Convolution3D 层 (与 Conv3D/Conv3DDerivative ND4J 操作)
MKL-DNN对其他层类型(如LSTM)的支持将在将来的版本中添加。
MKL-DNN 可以使用以下代码全局禁用(ND4J和DL4J)Nd4jCpu.Environment.getInstance().setUseMKLDNN(false);
MKL-DNN 可以全局禁用特定操作通过设置 ND4J_MKL_FALLBACK
环境变量为要禁用MKL-DNN支持的操作的名称。例如:ND4J_MKL_FALLBACK=conv2d,conv2d_bp
ND4J: 内存管理更改提高了性能
以前的ND4J版本使用定期垃圾收集(GC)来释放未在内存工作区中分配的内存。(请注意,默认情况下,DL4J几乎对所有操作都使用工作区,因此在训练 DL4J网络时,经常会禁用定期GC)。但是,对垃圾收集的依赖导致性能开销随着JVM堆中对象的数量而增加。
在1.0.0-beta4中,周期性垃圾收集在默认情况下是禁用的;相反,只有在需要从工作区外分配的数组中回收内存时,才会调用GC。
要重新启用定期GC(根据beta3中的默认设置),并将GC频率设置为每5秒(5000ms),可以使用:
ND4J: 改进了Rank 0/1数组支持
在以前的ND4J版本中,在获取行/列、使用INDArray.get(NDArrayIndex…)获取子数组或从Java数组/标量创建数组时,标量和向量有时是rank 2而不是rank 0/1。现在,这些rank 0/1情况的行为应该更加一致。注意:为了保持getRow和getColumn的旧行为(即分别返回shape[1,x]和[x,1]的rank2数组),可以使用getRow(long,boolean)和getColumn(long,boolean)方法。
DL4J: Attention 层被添加
添加点积attention 层 : AttentionVertex, LearnedSelfAttentionLayer, RecurrentAttentionLayer 与 SelfAttentionLayer
NeuralNetConfiguration.Builder(Link)上的dataType(dataType)方法为新网络设置新模型的参数/激活数据类型
EmbeddingLayer 与 EmbeddingSequenceLayer builders 现在有 .weightInit(INDArray)
和 .weightInit(Word2Vec)
方法用于从预训练的词向量(链接)初始化参数
PerformanceListener 现在可以配置为报告垃圾收集信息(数量/持续时间)链接
评估类现在将检查预测输出中的NaN,并抛出异常,而不是将argMax(NaNs)视为具有值0(Link)
为ParallelInference添加了ModelAdapter,以方便使用和YOLO等用例(通过避免分离(不在工作区内)数组提高性能)
增加了GELU激活函数(链接)
添加BertIterator(BERT训练的MultiDataSetIterator-有监督和无监督)链接
添加ComputationGraph.output(List<String> layers, boolean train, INDArray[] features, INDArray[] featureMasks)
方法仅获取特定层/顶点集的激活(无多余计算)(链接)
增加了胶囊网络层(在下一版本发布之前没有GPU加速)- CapsuleLayer, CapsuleStrengthLayer 与 PrimaryCapsules (Link)
Layer/NeuralNetConfiguration builder现在也有getter/setter方法,以便更好地支持Kotlin (Link)
UI的大多数JavaScript依赖项和字体已经迁移到WebJars (Link)
CheckpointListener 现在有静态的availableCheckpoints(File), loadCheckpointMLN(File, int) 与 lostLastCheckpointMLN(File) 等方法 (Link)
MultiLayerNetwork/ComputationGraph 现在,在某些不兼容的RNN配置中验证并抛出异常,如通过时间的截断反向传播与LastTimeStepLayer/Vertex 相结合(Link)
添加 BERT WordPiece 分词器 (Link)
Deeplearning4j UI现在支持多用户/多会话 - 用 UIServer.getInstance(boolean multiSession, Function<String,StatsStorage>)
在多会话模式下启动UI (Link)
Layer/NeuralNetworkConfiguration builder 方法验证标准化和改进(Link)
WordVectorSerializer 现在支持读取和导出文本格式向量,通过 WordVectorSerializer.writeLookupTable 与 readLookupTable方法 (Link]
更新JavaCPP, JavaCPP presets, 与 JavaCV 到 1.5版本 (Link)
增加了EvaluationBinary报警失败率计算(Link)
ComputationGraph GraphBuilder有一个 appendLayer 方法可用于添加层连接到上次添加的层/顶点 (Link)
添加 Wasserstein损失函数 (Link)
Keras导入:改进了lambda层导入的错误/异常 (Link)
Apache Lucene/Solr从7.5.0升级到7.7.1 (Link)
KMeans聚类策略现在是可配置的 (Link)
DL4J Spark 训练:修复共享集群(多个同时训练作业)-现在随机生成的Aeron流ID(链接)
如果抛出内存不足异常(Link),cuDNN帮助程序将不再试图依靠内置层实现
批量归一化全局方差重新参数化,以避免在分布式训练期间出现下溢和零/负方差(Link)
修正了tensorAlongDimension可能导致边界情况的数组顺序不正确,从而导致LSTMs(Link)中出现异常的问题(Link)
修复了ComputationGraph.getParam(String)的边界情况问题,其中层名称包含下划线(Link)
Keras导入:为权重初始化添加别名(链接)
修复了在克隆网络配置时无法正确克隆dropout实例的问题(链接)
修复了具有单个输入的ElementwiseVertex的工作区问题(链接)
修复了用户界面中分离StatsStorage可能会尝试两次删除存储的问题,从而导致异常(链接)
修复了从保存的格式(链接)还原网络时DepthwiseConv2D权重可能形状错误的问题
修复了BaseDatasetIterator.next()在设置预处理器(链接)时不应用预处理器的问题
改进了CenterLossOutputLayer(链接)的默认配置
修复了UNet非预训练配置(Link)的问题
修复了Word2Vec VocabConstructor在某些情况下可能死锁的问题(链接)
SkipGram和CBOW(在Word2Vec中使用)被设置为本地操作以获得更好的性能(Link)
修复了在使用InMemoryStatsListener(链接)时保留对分离的StatsListener实例的引用可能导致内存问题的问题
优化:工作区已添加到SequenceVectors和Word2Vec(链接)
为RecordReaderDataSetIterator改进校验 (Link)
改进的WordVectors实现中的未知词处理(Link)
Yolo2OutputLayer: 添加了对错误标签形状的验证。(链接)
LastTimeStepLayer 当输入掩码全部为0时,现在将引发异常(没有数据-没有最后一个时间步)(链接)
修复了MultiLayerNetwork/ComputationGraph.setLearningRate方法在某些罕见情况下可能导致更新器状态无效的问题(Link)
修正了Conv1D 层在MultiLayerNetwork.summary()中计算输出长度的问题(Link)
异步迭代器现在用于EarlyStoppingTrained中,以提高数据加载性能(Link)
EmbeddingLayer 与 EmbeddingSequenceLayer在CUDA上的性能已经被提升 (Link)
修复L2NormalizeVertex equals/hashcode方法中的问题(链接)
修复了ConvolutionalListener中的工作区问题(Link)
修复了 EvaluationBinary falsePositiveRate 计算 (Link)
为MultiLayerNetwork.output(DataSetIterator)方法添加了验证和有用的异常(Link)
修复了在尚未调用init()的情况下ComputationGraph.summary()将引发NullPointerException的小问题 (Link)
修正了一个计算图问题,在训练过程中,输入到一个单层/顶点重复多次可能会失败 (Link)
改进KMeans实现的性能 (Link)
修复了“wrapper”层(如FrozenLayer)中RNNs的rnnGetPreviousState问题 (Link)
Keras导入:修复了导入某些Keras分词器时出现的单词顺序问题(链接)
Keras导入:修复了KerasTokenizer类中可能存在UnsupportedOperationException异常的问题(Link)
Keras导入:修复了一个导入问题,模型结合了嵌入、变形和卷积层 (Link)
Keras导入:修复了一些RNN模型的输入类型推理的导入问题 (Link)
修复在 LocallyConnected1D/2D 层中的一些填充问题 (Link)
删除了对处理工作区外(分离的)INDArrays内存管理的定期垃圾收集调用的依赖 (Link)
添加了INDArray.close()方法,允许用户立即手动释放堆外内存 (Link)
SameDiff: 添加了TensorFlowImportValidator工具以确定是否可以将TensorFlow图导入SameDiff。报告使用的操作以及SameDiff中是否支持这些操作 (Link)
添加了Nd4j.createFromNpzFile方法以加载Numpy npz文件 (Link)
Added basic ("technology preview") of SameDiff UI. Should be considered early WIP with breaking API changes expected in future releases. Supports plotting of SameDiff graphs as well as various metrics (line charts, histograms, etc)添加了SameDiff UI的基本(“技术预览”)。应被视为早期WIP,并在未来版本中打破预期的API更改。支持绘制SameDiff图以及各种度量(折线图、直方图等)
当前嵌入在DL4J UI中 - 调用 UIServer.getInstance()
然后访问 localhost:9000/samediff
。
添加 DotProductAttention 与 MultiHeadDotProductAttention 操作 (Link)
添加 Nd4j.exec(Op) 与 Nd4j.exec(CustomOp) 方便的方法 (Link)
ND4J/SameDiff -新操作被添加:
SameDiff: 缩减操作现在支持轴参数的“动态”(非常量)输入。 (Link)
ROCBinary 现在有.getROC(int outputNum) 方法 (Link)
SameDiff: 添加 SDVariable.convertToVariable() 与 convertToConstant() - 以改变 SDVariable 类型 (Link)
为空数组上的缩减添加了检查和有用的异常(Link)
SameDiff“op creator”方法(SameDiff.tanh()、SameDiff.conv2d(…)等)已移动到子类-通过SameDiff.math()/random()/nn()/cnn()/rnn()/loss()方法或SameDiff.math/random/nn/cnn/rnn/loss字段访问creator (Link)
Libnd4j (c++) 增加基准测试框架 (Link)
添加了OpExecutioner.inspectArray(INDArray)方法以获取用于分析/调试的摘要统计信息(链接)
为Kotlin添加了SDVariable方法重载(plus, minus, times, 等) (Link)
增加了dot, reshape, permute的SDVariable便利方法 (Link)
添加SameDiff SDIndex.point(long, boolean keepDim)方法(将输出数组中的点索引保持为大小1轴) (Link)
添加了SameDiff ProtoBufToFlatBufConversion命令行工具,用于将TensorFlow冻结模型(protobuf)转换为SameDiff FlatBuffers (Link)
改进了SameDiff操作的数据类型验证 (Link)
ND4J数据类型-重大更改,请参阅本节顶部的突出显示
nd4j-base64 模块 (在 beta3中弃用) 已经被移除 . Nd4jBase64 类已被移到 nd4j-api (Link)
在指定执行沿维度操作(例如,缩减)的参数时,现在在操作构造函数中指定了缩减轴,而不是在OpExecutioner调用中单独指定。 (Link)
移除旧的基于Java循环的BooleanIndexing方法。应该使用等效的本地操作。 (Link)
移除 Nd4j.ENFORCE_NUMERICAL_STABILITY, Nd4j.copyOnOps, 等 (Link)
SameDiff“op creator”方法(SameDiff.tanh()、SameDiff.conv2d(…)等)已移动到子类-通过SameDiff.math()/random()/nn()/cnn()/rnn()/loss()方法或SameDiff.math/random/nn/cnn/rnn/loss字段访问creator (Link)
Nd4j.emptyLike(INDArray) 已被移除。使用 Nd4j.like(INDArray) 代替 (Link)
org.nd4jutil.StringUtils 被移除; 建议使用Apache commons lang3 StringUtils 代替 (Link)
nd4j-instrumentation 模块由于缺乏使用/维护而被移除 (Link)
修复了带有InvertMatrix.invert()和[1,1]形状矩阵的错误 (Link)
修复了长度为1的状态数组的更新器实例的边界情况缺陷 (Link)
修复了带有空文档的FileDocumentIterator的边界情况缺陷 (Link)
修复了1d矩阵上Nd4j.vstack返回1d输出而不是二维叠加输出的问题 (Link)
修复了Numpy格式导出的问题 - Nd4j.toNpyByteArray(INDArray)
(Link)
当SameDiff在外部工作区中使用时的修复 (Link)
修复了一个问题,即空NDarray可能被报告为具有标量形状信息,长度为1 (Link)
优化: libnd4j (c++) 操作的索引将在需要和可能的情况下使用uint进行更快的偏移计算。 (Link)
修复了INDArray.repeat在某些视图数组上的问题 (Link)
在视图阵列上执行某些操作的性能得到改进 (Link)
改进了non-EWS降维操作的性能 (Link)
改进转换操作的性能 (Link)
优化: 空数组只创建一次并缓存(因为它们是不可变的) (Link)
改进“reduce 3”缩减操作的性能 (Link)
改进了在多线程环境中对CUDA上下文的处理 (Link)
修复了Evaluation.reset()无法正确清除字符串类标签的问题 (Link)
SameDiff: 改进的梯度计算性能/效率;现在不再为非浮点变量定义“梯度”,也不再为不需要计算损失或参数梯度的变量定义“梯度” (Link)
IEvaluation实例的行为现在不再依赖于全局(默认)数据类型设置 (Link)
INDArray.get(point(x), y) 或 .get(y, point(x)) 现在,当对rank 2数组执行时,返回rank 1数组(Link)
为更好的性能和可靠性改写ND4J索引(INDArray.get)实现(Link)
本地响应归一化反向传播操作的修复 (Link)
大多数CustomOperation操作(如SameDiff中使用的操作)在下一版本之前都是CPU。未能及时完成1.0.0-beta4版本的GPU支持。
一些使用Intel Skylake CPU的用户报告说,当OMP_NUM_THREADS设置为8或更高时,MKL-DNN卷积2d反向传播操作(DL4J卷积层反向传播,ND4J“conv2d_bp”操作)出现死锁。调查表明,这可能是MKL-DNN的问题,而不是DL4J/ND4J的问题。见7637号问题。解决方法:通过ND4J_MKL_FALLBACK(见前面)禁用用于conv2d_bp操作的MKL-DNN,或对Skylake cpu全局禁用MKL-DNN。
LineRecordReader (和子类型)现在可以选择定义字符集 (Link)
添加 TokenizerBagOfWordsTermSequenceIndexTransform (TFIDF 转换), GazeteerTransform (单词表示的二进制向量) 与 MultiNlpTransform 转换; 添加 BagOfWordsTransform 接口 (Link)
修复了 ImageLoader.scalingIfNeeded 的问题(Link)
Arbiter 现在支持遗传算法搜索 (Link)
修复了Arbiter中使用的提前停止将导致序列化异常的问题 (Link)
ND4J/Deeplearning4j: 增加了对CUDA 10.0的支持。放弃了对CUDA 8.0的支持。(1.0.0-beta3版本支持CUDA 9.0、9.2和10.0)
SameDiff现在支持从DataSetIterator和MultiDataSetIterator进行训练和评估。 评估类已经被迁移到ND4J.
DL4J Spark 训练(梯度共享)现在是完全容错的,并且对阈值自适应(可能更稳健的收敛)有改进。现在可以在master/worker上轻松地独立配置端口。
使用用户指定的工作区添加了ComputationGraph/MultiLayerNetwork rnnTimeStep重载。 Link
添加 Cnn3DLossLayer Link
ParallelInference:实例现在可以实时更新模型(无需重新初始化) Link
ParallelInferenc: 添加 ParallelInference 的原地模式 Link
增加了对不兼容损失/激活函数组合的验证(如softmax+nOut=1, 或 sigmoid+mcxent)。可以使用outputValidation(false)禁用验证 Link
Spark 训练: 改进了梯度共享阈值自适应算法;使自定义阈值设置成为可能,并且使默认值对初始阈值配置更加健壮,在某些情况下提高了收敛速度。 Link
Spark 训练: 为大消息实现分块消息传递以减少内存需求(以及缓冲区长度不足问题) Link
Spark 训练: 添加 MeshBuildMode 配置用于提高了大型集群的可扩展性 Link
Spark 网络数据管道: 为“小文件”(图像等)分布式训练用例添加了FileBatch、FileBatchRecordReader等 Link
为容错/调试目的添加了FailureTestingListener Link
将Apache Lucene/Solr升级到7.5.0版(从7.4.0版) Link
MultiLayerNetwork/ComputationGraph.clearLayerStates 方法修改为 public (以前是 protected) Link
AbstactLayer.layerConf()
方法现在是 public Link
ParallelWrapper模块现在不再有artifact id的Scala版本后缀; 新 artifact id 是 deeplearning4j-parallel-wrapper
Link
在Yolo2OutputLayer中改进了无效输入/标签的验证和错误消息 Link
Spark 训练: 添加 SharedTrainingMaster.Builder.workerTogglePeriodicGC 和 .workerPeriodicGCFrequency 在worker上轻松配置ND4J垃圾回收配置。在worker上将默认GC设置为5秒 Link
Spark 训练: 添加了阈值编码调试模式(在训练 期间记录每个worker的当前阈值和编码统计信息)。使用 SharedTrainingConfiguration.builder.encodingDebugMode(true)
启用。注意这个操作有计算开销。 Link
修复了L1/L2和更新器(Adam、Nesterov等)在用小批量划分梯度以获得平均梯度之前被应用的问题。保持旧的行为,使用NeuralNetConfiguration.Builder.legacyBatchScaledL2(true)
Link.
请注意,对于某些更新器(如Adam)来说,学习率可能需要降低,以解释与早期版本相比的这一变化。其他一些更新器(如SGD、NoOp等)应该不受影响。
请注意,保存在1.0.0-beta2或更早版本中的反序列化(加载)配置/网络将默认为旧行为,以实现向后兼容性。所有新网络(在1.0.0-beta3中创建)将默认为新行为。
修复了EarlyStoppingScoreCalculator不能正确处理“最大分数”的情况而不是最小化的问题。 Link
修复VGG16ImagePreProcessor通道偏移值的顺序(BGR与RGB) Link
基于权值噪声的变分自编码缺陷修复 Link
修复BaseDataSetIterator 不遵循 'maximum examples' 配置的问题 Link
优化: 工作区现在用于计算图/多层网络评估方法(避免在计算期间分配必须由垃圾收集器清理的堆外内存) Link
修复了一个问题,即混洗与MnistDataSetIterator的子集组合在一起时,在重置之间不会保持相同的子集 Link
修复StackVertex.getOutputType的问题 Link
修复CNN到/从RNN预处理器处理掩码数组的问题 Link
修复了模型动物园中VGG16非预训练配置的问题 Link
修复 了TransferLearning nOutReplace中一行中多个层被修改的问题 Link
修复了CuDNN工作区在标准fit调用之外执行反向传播的问题 Link
修复了在计算图中的输出层上过早清除丢弃掩码的问题 Link
RecordReaderMultiDataSetIterator 现在支持5D数组 (用于 3D CNNs) Link
修复了TBPTT结合掩码和不同数量输入输出数组的多输入输出计算图中的缺陷 Link
改进了批归一化层的输入验证/异常 Link
修复了TransferLearning GraphBuilder nOutReplace与子采样层结合时的错误 Link
SimpleRnnParamInitializer 现在正确地遵循偏差初始化配置 Link
修复SqueezeNet动物园模型非预处理配置 Link
修复Xception动物园模型非预训练配置 Link
修正了多输出计算图的一些评估签名问题 Link
改进的大型网络多层网络/计算图汇总格式Link
修正了一个问题,如果一个层中的所有参数的梯度都恰好为0.0,那么梯度归一化可能导致NaNs Link
修复了MultiLayerNetwork/ComputationGraph.setLearningRate可能引发SGD和NoOp更新器异常的问题 Link
修复了StackVertex加掩码在某些罕见情况下的问题 Link
修复了1.0.0-alpha之前格式的冻结层的JSON反序列化问题 Link
修复了GraphBuilder.removeVertex在某些有限情况下可能失败的问题 Link
修复 CacheableExtractableDataSetFetcher中的缺陷 Link
DL4J Spark 训练:修复了多GPU训练+评估的线程/设备关联性问题 Link
DL4J Spark 训练: 使所有Aeron线程后台程序线程在所有其他线程完成时阻止Aeron停止JVM关闭 Link
为批归一化层添加了cudnnAllowFallback配置(如果CuDNN意外失败,则回滚到内置实现) Link
修复了BatchNormalization层的问题,该问题阻止在每个worker上正确同步平均值/方差估计值以进行GradientSharing训练,从而导致收敛问题Link
在ArchiveUtils中添加了检测ZipSlip CVE尝试的检查 Link
DL4J Spark 训练与评估:方法现在使用Spark上下文中的Hadoop配置来确保运行时集配置在Spark函数中可用,这些函数直接从远程存储(HDFS等)读取 Link
为Nd4j.readTxt添加了数据验证-现在对无效输入抛出异常,而不是返回不正确的值 Link
修复了KNN实现中使用无效距离函数(返回小于0的“距离”)时可能出现死锁的问题 Link
在加载Keras导入模型时添加了同步,以避免用于加载的底层HDFS库中出现线程安全问题 Link
修复了具有大预取值的Async(Multi)DataSetIterator的罕见问题 Link
DL4J中的IEvaluation类已被弃用并移到ND4J,以便它们可用于SameDiff训练。功能和api不变
MultiLayerConfiguration/ComputationGraphConfiguration pretrain(boolean)
与 backprop(boolean)
已被弃用并不再使用。使用 fit 和 pretrain/pretrainLayer 方法来替代 。 Link
ParallelWrapper 模块现在不再有artifact id的Scala版本后缀; 新 artifact id 为 deeplearning4j-parallel-wrapper
应用用来替代 Link
deeplearning4j-nlp-korean 模块现在有Scala版本后缀,由于scala依赖项; 新artifact ID 是 deeplearning4j-nlp-korean_2.10
与 deeplearning4j-nlp-korean_2.11
Link
在一个物理节点上同时运行多个Spark训练作业(即,来自一个或多个Spark作业的多个jvm)可能会导致网络通信问题。解决方法是在VoidConfiguration中手动设置唯一的流ID。对不同的作业使用唯一(或随机)整数值。 Link
修复了由于Keras 2.2.3+的Keras JSON格式更改而导致的导入问题 Link
为时间序列预处理添加了Keras导入 Link
Elephas Link
修复了在嵌入层之后使用导入模型变形的问题 Link
增加了对keras掩码层的支持 Link
修复了某些层/预处理器(如Permute)的JSON反序列化问题 Link
修正了Keras导入Nadam配置的问题 Link
添加了SameDiff训练和评估:SameDiff实例现在可以直接使用DataSetIterator和MultiDataSetIterator进行训练,并使用IEvaluation实例(已从ND4J移动到DL4J)进行评估 Link
添加了GraphServer实现:带有Java API的SameDiff(和Tensorflow,通过TF导入)的c++推理服务器 Link
为某些操作(Conv2d等)添加了MKL-DNN支持 Link
将ND4J(和DataVec)升级到Arrow 0.11.0 Link,它还修复了 Link
Added Nd4j.where 操作方法 (和 numpy.where同样的语义) Link
Added Nd4j.stack 操作方法 (combine arrays 结合数组 +把数组的rank加到1 ) Link
SameDiff损失函数:清除加正向传播实现 Link
CudaGridExecutioner 现在警告异常堆栈跟踪可能会延迟,以避免在异步执行操作期间调试异常时出现混淆 Link
JavaCPP 与 JavaCPP-presets 已更新到1.4.3版本 Link
改进SDVariable 类的 Javadoc Link
android端修复: 删除RawIndexer的使用 Link
Libnd4j 本地操作修复:
SameDiff: 改进的多输出情况下的错误处理 Link
修复了INDArray.permute无法正确抛出无效长度情况异常的问题 Link
DataSet.merge小修改 -现在签名可以接受任何DataSet的子类型 Link
INDArray.transposei 操作不是原地操作 Link
修复 INDArray.mmul 与 MMulTranspose的问题 Link
为ND4J创建方法添加了额外的顺序 验证(create, rand, 等) Link
修复从堆字节缓冲区反序列化时ND4J二进制反序列化(BinarySerde) 的问题 Link
Fixed issue with Nd4j-common ClassPathResource path resolution in some IDEs修复了某些ide中Nd4j-common ClassPathResource路径解析的问题 Link
修复了rank 1数组上的INDArray.get(interval)将返回rank 2数组的问题 Link
INDArray.assign(INDArray) 不再允许指定不同的形状数组(标量/矢量情况除外) Link
NDarrayStrings (and INDArray.toString()) 现在格式化数字时总是使用US语言环境Link
修正了V100 GPU特有的GaussianDistribution问题 Link
修复了V100 GPU特有的位图压缩/编码问题 Link
Transforms.softmax 现在在不支持的形状上抛出错误,而不是简单地不应用操作 Link
VersionCheck 功能: 处理在早期版本的Android上没有SimpleFileVisitor的情况 Link
SameDiff 卷积层配置 (Conv2dConfig/Conv3dConfig/Pooling3dConfig 等)已将参数名对齐 Link
CUDA 8.0支持已被删除。CUDA 9.0、9.2和10.0支持在1.0.0-beta3中提供
nd4j-base64模块内容已被弃用;从现在起使用nd4j-api中的等效类 Link
nd4j jackson模块中的某些类已被弃用;从现在起使用nd4j-api中的等效类 Link
Android 可能需要手动排除掉模块 nd4j-base64(现在已弃用)。这是由于org.nd4j.serde.base64.Nd4jBase64
类在 nd4j-api 和 nd4j-base64 模块中都出现了。两个版本都有相同的内容。使用 exclude group: 'org.nd4j', module: 'nd4j-base64'
来排除。
为org.opencv.core.Mat和字符串文件名添加了NativeImageLoader方法重载 Link
修复JDBCRecordReader对空值的处理 Link
改进了针对无效输入的ObjectDetectionRecordReader的错误/验证(如果图像对象中心位于图像边界之外) Link
修复了使用在早期版本的Android上不可用的方法进行FileSplit的问题Link
修复了JDBCRecordReader处理实数值列结果类型的问题 Link
添加了CSVRecordReader/LineRecordReader在未初始化的情况下使用的验证和有用异常 Link
修正了一些与dropout层有关的问题 Link
添加了org.nd4j.linalg.primitives.Pair/Triple和Scala元组之间的转换 Link
ND4J/Deeplearning4j: 增加了对CUDA9.2的支持。放弃对CUDA 9.1的支持。(1.0.0-beta2版本支持CUDA 8.0、9.0和9.2)
Deeplearning4j 资源(数据集、预训练模型)存储目录现在可以通过 DL4JResources.setBaseDirectory
方法或 org.deeplearning4j.resources.directory
系统属性
ND4J: 现在所有索引都是用long而不是int来完成的,以使数组的维数和长度大于整数(大约 21亿)。
ND4J: 现在将使用Intel MKL-DNN作为默认/捆绑的BLAS实现(替换以前默认的 OpenBLAS)
Deeplearning4j: 添加了内存溢出(OOM)崩溃转储报告功能。在训练 /推理OOM时提供内存使用和配置转储(以帮助调试和调整内存配置)。
资源(数据集、预训练模型)存储目录现在可以通过 DL4JResources.setBaseDirectory
方法或 org.deeplearning4j.resources.directory
系统属性。请注意,还可以为下载设置不同的基本位置(用于DL4J资源的本地镜像) Link
添加了内存溢出(OOM)崩溃转储报告功能。如果训练/推理OOM,则提供内存使用和配置的转储。对于MultiLayerNetwork/ComputationGraph.memoryInfo方法,也提供了相同的信息(没有崩溃)。可以使用系统属性禁用(或输出目录设置) - Link
添加了复合的[Multi]DataSetPreProcessor,以便在单个迭代器中应用多个[Multi]DataSetPreProcessor Link
多输出网络的附加计算图评估方法: evaluate(DataSetIterator, Map<Integer,IEvaluation[]>)
与 evaluate(MultiDataSetIterator, Map<Integer,IEvaluation[]>)
Link
添加了JointMultiDataSetIterator-用于从多个DataSetIterator创建多个MultiDataSetIterator的实用迭代器 Link
GraphVertices现在可以直接使用可训练参数(不只是用可训练参数封闭层) Link
添加 MultiLayerNetwork/ComputationGraph getLearningRate 方法 Link
增加了周期性的“1周期”学习率调度等 - Link
Spark训练的RDD重新分区更具可配置性(adds Repartitioner 接口) Link
添加 ComputationGraph.getIterationCount() 与 .getEpochCount() 为了与 MultiLayerNetwork保持一致 Link
Spark 评估: 添加了允许指定评估worker数量(小于Spark线程数)的评估方法重载 Link
CnnSentenceDataSetIterator 现在有一个Format参数,支持RNNs和1D CNNs的输出数据 Link
添加 ComputationGraph/MultiLayerNetwork.pretrain((Multi)DataSetIterator, int epochs)
方法重载 Link
EmbeddingSequenceLayer现在除了支持 [minibatch,seqLength]
格式数据外还支持 [minibatch,1,seqLength]
格式序列数据 Link
CuDNN 批归一化实现现在将用于rank 2输入,而不仅仅是rank 4输入 Link
MultiLayerNetwork 与 ComputationGraph output/feedForward/fit 方法现在是线程安全的,通过同步来实现。注意,由于性能的原因,不建议并发使用(相反:使用并行推理);但是现在同步的方法应该避免由于并发修改而导致的模糊错误 Link
BarnesHutTSNE 现在在距离度量未定义的情况下抛出一个有用的异常(例如,所有零加上余弦相似性) Link
BatchNormalization 层现在正确地断言,如果需要,将设置nOut(而不是以后出现不友好的形状错误) Link
修正了OutputLayer不能正确初始化参数约束的问题 Link
修正了Nesterov更新器在执行CUDA时只使用CPU操作的性能问题 Link
删除了DL4J优化器的TerminationCondition-在实践中未使用,并且有小的开销 Link
修复了启用工作区时EvaluativeListener可能遇到工作区验证异常的问题 Link
修复了计算图未正确调用TrainingListener.onEpochStart/onEpochEnd的问题 Link
修复了TensorFlowCnnToFeedForwardPreProcessor工作区问题 Link
CuDNN批量归一化的性能优化 Link
性能优化:在安全的情况下,Dropout将会被原地应用,避免复制。 Link
增加了Dropout的CuDNN实现 Link
减少CuDNN的内存使用:CuDNN工作内存现在在网络中的层之间共享和重用 Link
CuDNN批处理归一化实现将失败,数据类型为FP16 Link
修复双向LSTM可能错误地使用导致异常的工作区问题 Link
修复早停,分数最大化(准确率,F1等)没有正确触发终止条件的问题 Link
修复了在ComputationGraph.computeGradientAndScore()中标签掩码计数器可能错误递增的问题 Link
ComputationGraph 在训练期间没有设置lastEtlTime 字段 Link
修复了启用工作区时自动编码器层的问题Link
修复了EmbeddingSequenceLayer使用掩码数组的问题 Link
Lombok现在在任何地方都提供了作用域,在使用DL4J时不在用户类路径上 Link
修复了WordVectorSerializer.readParagraphVectors(File)初始化标签源的问题Link
Spark 训练(梯度共享)现在可以正确地处理训练期间遇到的空分区边界情况 Link
对于Spark梯度共享训练,错误传播得更好/更一致 Link
修复了1D CNN层的问题,该层具有遮罩阵列且stride>1(遮罩未正确缩小) Link
DL4J批归一化实现仅在训练期间(CuDNN未受影响),在推理期间未正确添加epsilon值 Link
当最大非填充值小于0时,具有最大池和ConvolutionMode.SAME的CUDNN子采样层可能把填充值(0)作为边界值的最大值。 Link
Spark梯度共享训练现在可以将监听器正确地传递给worker Link
修复了用户界面和FileStatsStorage的罕见(非终端)并发修改问题 Link
CuDNN 卷积层现在支持dilation>2(以前:使用DL4J conv层实现作为回调) Link
Yolo2OutputLayer 现在实现 computeScoreForExamples() Link
SequenceRecordReeaderDataSetIterator 现在正确处理“没有标签”的情况Link
修复了BarnesHutTSNE可能遇到工作区验证异常的问题 Link
在某些情况下,EMNIST迭代器在重置后可能会产生不正确的数据Link
由于缺少CuDNN支持,Graves LSTM已被弃用,取而代之的是LSTM,但其精度与实际情况类似。改用LSTM类。
deeplearning4j-modelexport-solr: 现在使用Lucene/Solr版本7.4.0(以前是7.3.0) Link
CNN2d层的掩码数组必须是可广播的4d格式: [minibatch,depth or 1, height or 1, width or 1]
- 以前是二维的形状 [minibatch,height]
或 [minibatch,width]
。 这可以防止以后的情况(池化层)中的模糊性,并允许更复杂的掩码场景(例如在同一个小批量中为不同的图像大小进行掩码 )。 Link
一些旧的/不推荐使用的模型和层方法已被删除。(validateInput(), initParams())。因此,可能需要更新某些自定义层 Link
Windows用户无法加载SvhnLabelProvider(在HouseNumberDetection示例中使用)中使用的HDF5文件。Linux/Mac用户不受影响。windows用户的解决方法是添加sonatype快照依赖项org.bytedeco.javacpp-presets:hdf5-platform:jar:1.10.2-1.4.3-SNAPSHOT
Link
Keras 模型导入现在导入每个Keras应用程序
支持GlobalPooling3D图层导入
支持RepeatVector层导入
支持LocallyConnected1D和LocallyConnected2D层
现在可以通过注册自定义SameDiff层导入Keras Lambda层
现在支持所有Keras优化器
现在可以导入所有高级激活功能。
许多小错误已经被修复,包括对所有的BatchNormalization配置进行适当的权重设置,改进SeparableConvolution2D的形状,以及完全支持双向层。
ND4J: all indexing is now done with longs instead of ints to allow for arrays with dimensions and lengths greater than Integer.MAX_VALUE (approx. 2.1 billion)现在所有索引都是用long而不是int来完成的,以使数组的维数和长度大于整数(大约为 21亿)。
添加了使用Nd4j.writesNumpy(INDArray,File)编写Numpy.npy格式的功能,并使用Nd4j.convertToNumpy(INDArray)将INDArray转换为内存中严格的Numpy格式Link
ND4j-common ClassPathResource: 添加 ClassPathResource.copyDirectory(File) Link
SameDiff: 现有大量新操作和已存在操作的反向传播实现
添加 Nd4j.randomBernoulli/Binomial/Exponential 便捷方法 Link
添加了禁用/禁止ND4J初始化日志记录的方法 通过 org.nd4j.log.initialization
系统属性 Link
SameDiff 类 - 大多数op/constructor方法现在都有完整/有用的javadoc Link
现在可以全局禁用工作区,忽略工作区配置。这主要用于调试;使用 Nd4j.getWorkspaceManager().setDebugMode(DebugMode.DISABLED)
或 Nd4j.getWorkspaceManager().setDebugMode(DebugMode.SPILL_EVERYTHING);
来启用它。 Link [Link]
为环境变量处理添加了EnvironmentalAction API Link
SameDiff: 执行和单个操作的大量错误修复
修复了使用真标量的INDArray.toDoubleArray()的问题(rank 0数组)Link
修复了DataSet.sample()不适用于rank 3+功能的问题 Link
IActivation 现在实现对激活和梯度验证/强制执行相同的形状Link
修正了向量为1d的muliColumnVector问题 Link
ImagePreProcessingScaler现在支持通过NormalizerSerializerStrategy和ModelSerializer进行序列化 Link
DL4J Spark梯度共享分布式训练实现中阈值编码的性能优化 Link
SameDiff: DL4J Spark梯度共享分布式训练实现中阈值编码的性能优化 Link
DataSet.save() 与 MultiDataSet.save() 方法现在出现时保存示例元数据 Link
修正了当数据集不等分为没有余数的包时KFoldIterator的问题 Link
修复了当资源位于带有空格的路径上时版本检查功能无法加载资源的问题 Link
CUDA 9.1支持已被移除。提供CUDA 8.0、9.0和9.2支持
由于长索引的变化,在某些地方应该使用 long/long[]代替int/int[]。(如 INDArray.size(int), INDArray.shape())
简化DataSetIterator API: totalExamples(), cursor() 与 numExamples() - 这些在大多数DataSetIterator实现中都是不受支持的,并且在实践中没有用于训练。自定义迭代器也应该删除这些方法 Link
已删除长期不推荐使用的getFeatureMatrix()。改用DataSet.getFeatures()。 Link
已删除未使用且未正确测试/维护的实用程序类BigDecimalMath。如果需要,用户应该为这个功能找到一个候选库。
未正确维护的复数支持类(IComplexNumber,IComplexNDArray)已完全删除 Link
添加了AnalyzeLocal类以镜像AnalyzeSpark的功能(但没有Spark依赖项) Link
添加了JacksonLineSequenceRecordReader:RecordReader用于多示例JSON/XML,其中文件中的每一行都是一个独立的示例Link
添加 RecordConvert.toRecord(Schema, List<Object>)
Link
添加缺失的 FloatColumnCondition Link
为“CSV中的每一行是一个序列,序列是单值/单变量”添加了CSVLineSequenceRecordReader Link
为“单个CSV中的多个多值序列”数据添加了CSVMultiSequenceRecordReader Link
修复了Android上NativeImageLoader的问题 Link
已修复ExcelRecordReader的问题 Link
修复了 CSVRecordReader.next(int)
参数错误的问题,可能导致生成不必要的大列表 Link
添加了DataSource接口。与旧的DataProvider不同,这不需要JSON序列化(只需要一个无参数构造函数) Link
DataProvider已被弃用。改用DataSource。
DL4J的性能和内存优化
添加 ComputationGraph.output(DataSetIterator) 方法 Link
添加 SparkComputationGraph.feedForwardWithKey 具有特征掩码支持的重载 Link
添加了从配置获取每个层的输入/激活类型的支持:ComputationGraphConfiguration.getLayerActivationTypes(InputType...)
, ComputationGraphConfiguration.GraphBuilder.getLayerActivationTypes()
, NeuralNetConfiguration.ListBuilder.getLayerActivationTypes()
, MultiLayerConfiguration.getLayerActivationTypes(InputType)
methods Link
Evaluation.stats() 现在以更易于读取的矩阵格式而不是列表格式打印混淆矩阵 Link
添加ModelSerializer.addObjectToFile, .getObjectFromFile and .listObjectsInFile 用于将任意Java对象存储在与保存的网络相同的文件中 Link
添加了SpatialDropout支持(具有Keras导入支持) Link
添加MultiLayerNetwork/ComputationGraph.fit((Multi)DataSetIterator, int numEpochs)
重载 Link
增加了性能(硬件)监听器: SystemInfoPrintListener
与 SystemInfoFilePrintListener
Link
通过优化工作区的内部使用来优化性能和内存 Link
RecordReaderMultiDataSetIterator 将不再尝试将未使用的列转换为数值 Link
新增动物园模型:
(将要做 )
修正了RecordReaderMulitDataSetIterator,其中某些构造函数的输出可能不正确 Link
修复了计算图拓扑排序在所有平台上可能不一致的问题;有时可能中断在PC上训练并部署在Android上的计算图(具有多个有效拓扑排序) Link
修复了CuDNN批归一化的问题,使用 1-decay
替代 decay
Link
deeplearning4j-cuda 如果在将nd4j-native后端设置为更高优先级的类路径上出现异常,则不再引发异常 Link
为CifarDataSetIterator添加了RNG控件 Link
WordVectorSerializer完成后立即删除临时文件 Link
WorkspaceMode.SINGLE 与 SEPARATE 已经被弃用; 使用 WorkspaceMode.ENABLED 代替
内部层API更改:自定义层将需要更新为新的层API-请参阅内置层或自定义层示例
由于JSON格式更改,需要先注册1.0.0-beta JSON(ModelSerializer)之前格式的自定义层等,然后才能对其进行反序列化。保存在1.0.0-beta或更高版本中的内置层和模型不需要这样做. 使用 NeuralNetConfiguration.registerLegacyCustomClassesForJSON(Class)
来实现这个目的
IterationListener已被弃用,取而代之的是TrainingListener。对于现有自定义侦听器, 从 implements TrainingListener
切换到 extends BaseTrainingListener
Link
ExistingDataSetIterator 已弃用;使用 fit(DataSetIterator, int numEpochs)
method instead方法代替
ComputationGraph TrainingListener onEpochStart 与 onEpochEnd 未正确调用方法
DL4J Zoo Model FaceNetNN4Small2 未正确调用方法
早停计分计算器的值THAR应最大化(准确性,F1等)不正常工作(值被最小化,而不是最大化)。解决方法:重写ScoreCalculator.calculateScore(...)
并返回 1.0 - super.calculateScore(...)
.
并非所有的操作梯度都实现了自动微分
在1.0.0-beta版本中添加的绝大多数新操作尚未使用GPU。
ImageRecordReader 现在记录推理的标签类的数量(以减少用户在错误配置时丢失问题的风险) Link
为多个列添加了AnalyzeSpark.getUnique重载Link
增加了性能/计时模块 Link
通过缓冲区重用减少ImageRecordReader垃圾生成 Link
删除了DataVec中使用的反射库 Link
TransformProcessRecordReader批处理支持修复 Link
带过滤器操作的TransformProcessRecordReader修复 Link
修复了ImageRecordReader/ParentPathLabelGenerator错误过滤包含 .
character(s) 的目录Link
ShowImageTransform现在延迟初始化帧以避免出现空白窗口 Link
DataVec ClassPathResource 已被弃用; 使用 nd4j-common 版本替代 Link
为OCNN(一分类神经网络)添加LayerSpace
修复了可能导致在UI中不正确呈现第一个模型结果的时间戳问题 Link
在遇到终止条件时返回之前,执行现在等待最后一个模型完成Link
根据DL4J等:反射库的使用已完全从Arbiter中删除 Link
由于Android编译的问题,不再使用Eclipse集合库 Link
对已完成模型的改进清理以减少对训练的最大内存需求Link
ND4J:添加了SameDiff-Java自动微分库(alpha版本)和Tensorflow导入(技术预览)以及数百个新操作
ND4J: 增加了CUDA 9.0和9.1支持(使用cuDNN),放弃了对CUDA 7.5的支持,继续支持CUDA 8.0
ND4J: 本机二进制文件(Maven Central上的nd4j-native)现在支持AVX/AVX2/AVX-512(Windows/Linux)
DL4J: 大量新层和API改进
DL4J: Keras 2.0 导入支持
Layers (新的和增强的)
添加 Yolo2OutputLayer CNN 层用于目标检测 (Link). 同样查看 DataVec的 ObjectDetectionRecordReader
添加通过 hasBias(boolean)
实现对“无偏置”层的支持
config (DenseLayer, EmbeddingLayer, OutputLayer, RnnOutputLayer, CenterLossOutputLayer, ConvolutionLayer, Convolution1DLayer). EmbeddingLayer 现在默认为无偏置 (Link)
增加了对空洞卷积(也称为“膨胀”卷积)的支持- ConvolutionLayer, SubsamplingLayer, 和 1D 版本 。 (Link)
ElementWiseVertex 现在(另外) 支持 Average
和 Max
模式,除Add/Subtract/Product 外(Link)
添加 SeparableConvolution2D 层 (Link)
添加 Deconvolution2D 层 (也叫转置卷积,分步卷积层) (Link)
添加ReverseTimeSeriesVertex (Link)
添加 RnnLossLayer - 无参数版本的RnnOutputLayer,或相当于RNN的LossLayer (Link)
添加了CnnLossLayer-没有参数CNN输出层,用于分割、去噪等用例。 (Link)
Added Bidirectional layer wrapper (converts any uni-directional RNN to a bidirectional RNN) 添加了双向层包装器(将任何单向RNN转换为双向RNN)(Link)
添加SimpleRnn层(也叫 "香草" RNN 层) (Link)
添加了LastTimeStep包装层(包装一个RNN层以获取上一个时间步,如果存在则考虑掩码)(Link)
添加了MaskLayer实用程序层,当存在一个掩码数组时,该实用程序层仅在正向传递时将激活归零 (Link)
添加了alpha版本(还不稳定)SameDiff层对DL4J的支持(注意:向前传递,目前仅限于CPU)(Link)
添加Cropping2D 层 (Link)
添加了参数约束API(LayerConstraint接口), 和 MaxNormConstraint, MinMaxNormConstraint, NonNegativeConstraint, UnitNormConstraint 实现 (Link)
学习率调度的显著重构 (Link)
添加了ISchedule接口;添加了Exponential、Inverse、Map、Poly、Sigmoid和Step调度实现(Link)
Added support for both iteration-based and epoch-based schedules via ISchedule. Also added support for custom (user defined) schedules通过ISchedule增加了对基于迭代和基于轮数的计划的支持。还添加了对自定义(用户定义)计划的支持
在更新程序上配置学习率调度, 通过 .updater(IUpdater)
方法
添加了dropout API(IDropout-以前的dropout是可用的,但不是类);添加了Dropout、AlphaDropout(用于自归一化网络)、GaussianDropout(乘法)、GaussianNoise(加法)。添加了对自定义dropout类型的支持 (Link)
通过ISchedule接口增加了对辍学调度的支持 (Link)
增加了权重/参数噪声API(IWeightNoise接口);增加了DropConnect和WeightNoise(加法/乘法高斯噪声)实现(Link);DropConnect和dropout现在可以同时使用
添加层配置别名 .units(int)
相当于 .nOut(int)
(Link)
添加 ComputationGraphConfiguration GraphBuilder .layer(String, Layer, String...)
的别名 .addLayer(String, Layer, String...)
不再需要层索引 MultiLayerConfiguration ListBuilder (i.e., .list().layer(<layer>)
现在可以用于配置) (Link)
添加 MultiLayerNetwork.summary(InputType)
和 ComputationGraph.summary(InputType...)
方法(显示层和激活大小信息) (Link)
MultiLayerNetwork, ComputationGraph 分层可训练层现在可以跟踪轮数量 (Link)
添加deeplearning4j-ui-standalone 模块: uber-jar 方便用户界面服务器的启动 (使用: java -jar deeplearning4j-ui-standalone-1.0.0-alpha.jar -p 9124 -r true -f c:/UIStorage.bin
)
权重初始化:
添加 .weightInit(Distribution)
方便/重载(之前:必需.weightInit(WeightInit.DISTRIBUTION).dist(Distribution)
) (Link)
WeightInit.NORMAL (用于自归一化神经网络) (Link)
Ones, Identity 权重初始化 (Link)
添加新分布(LogNormalDistribution, TruncatedNormalDistribution, OrthogonalDistribution, ConstantDistribution) 可用于权重初始化 (Link)
RNNs: 增加了将循环网络权重的权重初始化分别指定为“输入”权重的功能(Link)
添加的层别名: Convolution2D (ConvolutionLayer), Pooling1D (Subsampling1DLayer), Pooling2D (SubsamplingLayer) (Link)
增加了Spark IteratorUtils-包装了一个用于Spark网络训练的RecordReaderMultiDataSetIterator (Link)
CuDNN支持层(卷积层等)现在警告用户如果使用没有CuDNN的CUDA (Link)
二进制交叉熵(LossBinaryXENT)现在实现了裁剪(默认情况下为1e-5到(1-1e-5))以避免数值下溢/NaNs (Link)
SequenceRecordReaderDataSetIterator 现在支持多标签回归(Link)
TransferLearning FineTuneConfiguration 现在有了设置训练/推理工作区模式的方法 (Link)
IterationListener iterationDone 方法现在同时报告当前迭代和epoch计数;删除了不必要的调用/被调用方法 (Link)
添加 MultiLayerNetwork.layerSize(int), ComputationGraph.layerSize(int)/layerSize(String) 轻松确定层的大小 (Link)
添加 MultiLayerNetwork.toComputationGraph() 方法 (Link)
添加 NetworkUtils 易于更改已初始化网络的学习速率的方便方法 (Link)
添加 MultiLayerNetwork.save(File)/.load(File) 和 ComputationGraph.save(File)/.load(File) 方便方法 (Link)
添加 CheckpointListener 在训练期间定期保存模型副本(每N个iter/epoch,每T个时间单位) (Link)
添加带掩码数组的ComputationGraph输出方法重载 (Link)
一种新的LossMultiLabel损失函数 (Link)
增加了用于早停的额外评分功能(ROC指标、全套评估/回归指标等) (Link)
为多层网络和计算图添加额外的ROC和ROCMultiClass评估重载 (Link)
阐明Evaluation.stats()输出以引用“预测”而不是“示例”(前者更适合于RNN) (Link)
EarlyStoppingConfiguration 现在支持 Supplier<ScoreCalculator>
用于非序列化分数计算器 (Link)
改进的通过错误方法加载模型时的ModelSerializer异常 (例如 尝试通过restoreMultiLayerNetwork加载计算图) (Link)
添加了SparkDataValidation实用程序方法来验证HDFS或本地上保存的DataSet和MultiDataSet (Link)
ModelSerializer: 添加 restoreMultiLayerNetworkAndNormalizer and restoreComputationGraphAndNormalizer 方法(Link)
ParallelInference 现在有了支持输入掩码数组的输出重载 (Link)
Lombok不再作为传递依赖项包含 (Link)
具有大量历史记录的J7FileStatsStorage的性能改进 (Link)
修复变分自动编码器层的用户界面层大小 (Link)
UI Play servers 切换到生产(PROD)模式(Link)
与以上相关:用户现在可以设置 play.crypto.secret
系统属性手动设置播放应用程序密钥;默认情况下是随机生成的 (Link).
SequenceRecordReaderDataSetIterator 会应用预处理器两次 (Link)
Evaluation 在Spark上使用时,无参构造函数可能导致NaN评估度量
CollectScoresIterationListener可能以无休止地重复 (Link)
Async(Multi)DataSetIterator 调用 reset() 在某些情况下,底层迭代器可能会导致问题(Link)
在某些情况下,L2正则化可能(错误地)应用于冻结层 (Link)
NearestNeighboursServer的日志修复 (Link)
BaseStatsListener内存优化 (Link)
用于从流加载Keras模型的ModelGuesser修复(以前可能会失败)(Link)
修复DuplicateTimeSeriesVertex中的错误条件 (Link)
修复某些有效计算图网络上的getMemoryReport异常 (Link)
RecordReaderDataSetIterator 当与预处理器一起使用时,在某些情况下可能会导致异常 (Link)
CnnToFeedForwardPreProcessor 只要输入数组长度与预期长度匹配,就可以悄悄地对无效输入变形 (Link)
ModelSerializer如果JVM崩溃,将不会删除临时文件;现在不再需要时立即删除 (Link)
RecordReaderMultiDataSetIterator 在某些情况下,当设置为“ALIGN_END”模式时,不能添加掩码数组 (Link)
ConvolutionIterationListener 以前在冻结所有卷积层时产生的IndexOutOfBoundsException(Link)
PrecisionRecallCurve.getPointAtRecall 当多个点具有相同的召回率时,可以以正确但次优的精度返回一个点(Link)
如果dropout存在于现有层上,在迁移学习上设置dropout(0),FineTuneConfiguration不会删除dropout。 (Link)
在某些罕见的情况下,Spark评估可能导致NullPointerException (Link)
ComputationGraph: 配置验证中不总是检测到断开连接的顶点(Link)
激活层并不总是继承全局激活函数配置 (Link)
PerformanceListener 现在可序列化 (Link)
ScoreIterationListener 与 PerformanceListener 现在报告模型迭代,而不是“自监听器创建以来的迭代” (Link)
合并ROC实例后,不能更新ROC类中的精度/回调曲线缓存值 (Link)
在评估大量实例之后,ROC合并可能会产生IllegalStateException(Link)
向EmbeddingLayer添加了对无效输入索引的检查(Link)
修复了从JSON加载遗留(0.9.0以前版本)模型配置时可能出现的NPE问题 (Link)
修复了EvaluationCalibration HTML导出图表呈现的问题 (Link)
修复了与Spark训练一起使用时使用J7FileStatsStorage可能不正确呈现UI/StatsStorage图表的问题(Link)
MnistDataSetIterator 不会总是可靠地检测并自动修复/重新下载损坏的下载数据 (Link)
修复线程中断的传播 (Link)
修复TSNE将数据发布到UI以进行可视化 (Link)
PerformanceListener现在对无效的频率参数抛出一个有用的异常(在构造函数中),而不是运行时ArithmeticException (Link)
RecordReader(Multi)DataSetIterator 现在,Writable值为非数值时抛出更有用的异常(Link)
UI: 修复了从uber JARs读取国际化数据.txt文件时非英语语言可能出现的字符编码问题(Link)
UI: 修复了加载I18N数据时试图错误解析非DL4J UI资源的问题 (Link)
各种线程修复 (Link)
Evaluation: 现在无参方法(f1(),precion()等)为二分类返回单个类值,而不是宏平均值;请澄清stats()方法和javadoc中的值 (Link)
早停训练:未正确调用TrainingListener opEpochStart/End(等)方法 (Link)
修复了不总是将dropout应用于RNN层输入的问题(Link)
ModelSerializer:改进了从无效/空/关闭流中读取数据时的验证/异常 (Link)
基于就地随机操作的网络权值初始化内存优化 (Link)
修正了VariationalAutoencoder builder解码器层大小验证(Link)
改进的Kmeans吞吐量link
将RPForest添加到邻近值算法 link
对于多层网络和计算图,缺省训练工作空间模式已从NONE切换到SEPARATE。 (Link)
行为变更: fit(DataSetIterator)
类似的方法不再进行分层预训练,然后进行反向传播。用于预训练,使用 pretrain(DataSetIterator)
和 pretrain(MultiDataSetIterator)
方法 (Link)
以前不推荐的更新器配置方法 (.learningRate(double)
, .momentum(double)
etc) 全被删除
配置学习率: 使用 .updater(new Adam(lr))
代替.updater(Updater.ADAM).learningRate(lr)
配置偏置学习率: 使用 .biasUpdater(IUpdater)
方法
配置学习率调度: 使用 use .updater(new Adam(ISchedule))
通过枚举更新器配置(i.e., .updater(Updater)
) 已弃用;使用 .updater(IUpdater)
.regularization(boolean)
已删除配置;功能现在总是等同于.regularization(true)
.useDropConnect(boolean)
移除;使用 .weightNoise(new DropConnect(double))
代替
.iterations(int)
方法已被删除(很少使用,用户感到困惑)
多个实用程序类 (在 org.deeplearning4j.util
) 已弃用和/或移至 nd4j-common. 在nd4j common中使用相同的类名org.nd4j.util
代替。
DL4J中的DataSetIterators已从deeplearning4j nn模块移动到新的deeplearning4j-datasets, deeplearning4j-datavec-iterators 和 deeplearning4j-utility-iterators。包/导入保持不变;deeplearning4j-core将它们作为可传递的依赖项引入,因此在大多数情况下不需要用户更改。 (Link)
以前已弃用 .activation(String)
已被移除;使用 .activation(Activation)
或 .activation(IActivation)
代替
层API更改:自定义层可能需要实现applyConstraints(int iteration, int epoch)
方法
参数初始值设定项API更改:自定义参数初始值设定项可能需要实现isWeightParam(String)
和 isBiasParam(String)
方法
RBM (受限制的玻尔兹曼机器)层已完全移除。考虑使用VariationalAutoencoder作为替换 (Link)
GravesBidirectionalLSTM 已被弃用;使用 new Bidirectional(Bidirectional.Mode.ADD, new GravesLSTM.Builder()....build()))
代替
以前不推荐的WordVectorSerializer方法现在已被删除 (Link)
删除 deeplearning4j-ui-remote-iterationlisteners 模块并废弃 RemoteConvolutionalIterationListener (Link)
与0.9.1(配置了工作区)相比,CUDA上某些网络类型的性能可能会降低。这将在下一个版本中解决
在对CUDA的FP16支持下发现了一些问题 (Link)
Keras 2支持,保持Keras 1的向后兼容性
Keras 2和1导入使用完全相同的API,由DL4J推断
Keras单元测试覆盖率增加了10倍,更多的真实集成测试
用于导入和检查层权重的单元测试
Leaky ReLU, ELU, SELU 支持模型导入
所有Keras层都可以用可选的偏置项导入
删除旧的deeplearning4j keras模块,删除旧的“模型”API
所有Keras初始化 (Lecun normal, Lecun uniform, ones, zeros, Orthogonal, VarianceScaling, Constant) 被支持
DL4J和Keras模型导入支持的1D卷积和池化
Keras模型导入支持的一维和二维空洞卷积层
支持1D 零填充层
DL4J和模型导入完全支持Keras约束模块
DL4J和Keras模型导入中的1D和2D层上采样(包括测试中的GAN示例)
Keras模型导入支持的大多数合并模式,支持Keras 2合并层API
DL4J与Keras模型导入支持可分离卷积二维层
DL4J和Keras模型导入支持二维反卷积
导入时完全支持Keras噪声层(Alpha dropout、Gaussian dropout和noise)
在Keras模型导入中支持SimpleRNN层
支持双向层wrapper keras模型导入
在DL4J中添加LastTimestepVertex以支持Keras RNN层的return_sequences=False。
DL4J支持循环权重初始化和Keras导入集成。
SpaceToBatch和BatchToSpace层在DL4J中提供更好的YOLO支持,加上端到端的YOLO Keras导入测试。
DL4J和Keras模型导入中的Cropping2D支持
在0.9.1中已弃用 Model
和 ModelConfiguration
已被永久删除。使用 KerasModelImport 代替, 它现在是Keras模型导入的唯一入口点。
Embedding layer: 在DL4J中,嵌入层的输出默认为2D,除非指定了预处理器。在Keras中,输出总是3D的,但是根据指定的参数可以解释为2D。这通常会导致在导入嵌入层时出现困难。许多情况已得到处理,问题已得到解决,但仍有不一致之处。
Batchnormalization layer: DL4J的批归一化层比Keras的版本要严格得多(一种好的方式)。例如,DL4J仅允许对4D卷积输入的空间维度进行归一化,而在Keras中,任何轴都可以用于归一化。根据维度顺序(NCHW对比NHWC)和Keras用户使用的特定配置,这可能会导致预期的(!) 以及意外的导入错误。
在DL4J中导入用于训练 目的的Keras模型的支持仍然非常有限(enforceTrainingConfig == true),将在下一版本中正确处理。
Keras Merge layers:Keras functional API似乎很好用,但是在Sequential模型中使用时会出现问题。
Reshape layers: 在导入时可能有点不可靠。DL4J很少需要在标准输入预处理器之外显式地重塑输入。在路缘石中,经常使用重塑层。在边缘情况下,映射这两种范式可能很困难。
新增数百项新操作
具有自动微分功能的新DifferentialFunctionapi(参见SameDiff一节) Link
新增tensorflow导入技术预览(支持1.4.0及以上版本)
增加了Apache Arrow序列化,支持新的tensor API Link
增加对AVX/AVX2和AVX-512指令集的支持,适用于Windows/Linux的nd4j-native Link
Nvidia CUDA 8/9.0/9.1 现在被支持
引入了工作区改进以确保安全:默认情况下启用SCOPE_PANIC profiling模式
INDArray serde的FlatBuffers支持
添加了对自动广播操作的支持
libnd4j, underlying c++ library, 功能增强,现在提供: NDArray 类, Graph 类, 并可以用作独立库或可执行文件。
卷积相关操作现在除了支持NCHW数据格式外,还支持NHWC。
累积操作现在可以选择保持缩小的维度。
并非所有的操作梯度都实现了自动微分
在1.0.0-alpha中添加的绝大多数新操作尚未使用GPU。
初始技术预览 Link
IF和WHILE原生支持控制流
用于ND4J的SameDiff自动微分引擎的Alpha发布。
有两种可用的执行模式:Java驱动的执行和序列化图的本机执行。
SameDiff图可以使用FlatBuffers序列化
从SameDiff操作生成并运行计算图。
图可以对输入数据运行正向传播,并计算反向传播的梯度。
已经支持许多高级层,如密集连层、卷积(1D-3D)反卷积、可分离卷积、池和上采样、批处理归一化、局部响应归一化、LSTM和GRU。
总共有大约350个SameDiff操作可用,包括许多用于构建复杂图的基本操作。
支持TensorFlow和ONNX图的基本导入以进行推理。
TFOpTests 是用于为TensorFlow导入创建测试资源的专用项目。
已知问题和限制
在1.0.0-alpha中添加的绝大多数新操作尚未使用GPU。
虽然许多在实践中广泛使用的基本操作和高级层都得到了支持,但是操作的覆盖范围仍然有限。目标是实现与TensorFlow的特征等价,并完全支持TF图的导入。
一些现有的操作没有实现反向传播。 (在SameDiff中叫作 doDiff
).
为单机执行添加了LocalTransformExecutor(没有Spark依赖项) (Link)
添加了ArrowRecordReader(用于读取ApacheArrow格式的数据) (Link)
添加了用于在RecordReader和RecordWriter之间转换的RecordMapper类(Link)
添加了BoxImageTransform-一种不改变纵横比而裁剪或填充的ImageTransform (Link)
添加 CSVVariableSlidingWindowRecordReader (Link)
ImageRecordReader: 支持标签的回归用例(以前:仅分类)(Link)
DataAnalysis/AnalyzeSpark 现在包括分位数(通过t-digest)(Link)
添加AndroidNativeImageLoader.asBitmap(), Java2DNativeImageLoader.asBufferedImage() (Link)
StringToTimeTransform 如果没有提供格式,将尝试猜测时间格式 (Link)
改进了Android上NativeImageLoader的性能 (Link)
添加 BytesWritable (Writable for byte[] data) (Link)
添加 TranformProcess.inferCategories 从RecordReader自动推断类别的方法 (Link)
Lombok不再作为传递依赖项包含 (Link)
MapFileRecordReader 和 MapFileSequenceRecordReader可以处理多部分映射文件的空分区/拆分 (Link)
Writables: 相等语义已更改:例如现在 DoubleWritable(1.0) 等于于 IntWritable(1) (Link)
NumberedFileInputSplit 现在支持前导零 (Link)
CSVSparkTransformServer 与 ImageSparkTransformServer 播放服务器改为生产模式(Link)
修复FloatMetaData的JSON子类型信息 (Link)
JacksonRecordReader, RegexSequenceRecordReadert序列化修复 (Link)
添加RecordReader.resetSupported() 方法 (Link)
SVMLightRecordReader 现在实现 nextRecord() 方法 (Link)
使用条件时自定义缩减的修复 (Link)
不再使用后端口java.util.functions;改为使用ND4J函数API (Link)
修正时间列的转换数据质量分析 (Link)
许多util类 (主要在 org.datavec.api.util
包) 已弃用或删除;在nd4j-common模块中使用等效名称的util类 (Link)
RecordReader.next(int) 方法现在返回 List<List<Writable>>
用于批量, 不是 List<Writable>
。同样查看 NDArrayRecordBatch
RecordWriter 和 SequenceRecordWriter APIs 已使用多个新方法更新
根据DL4J API更改: 更新器配置选项(learning rate, momentum, epsilon, rho等)已移到参数空间。 引入更新空间(AdamSpace、AdaGradSpace等) (Link)
根据DL4J API的变化:Dropout配置现在是通过 ParameterSpace<IDropout>
, DropoutSpace 引入 (Link)
RBM 层空间被删除 (Link)
ComputationGraphSpace: 添加 layer/vertex 带有预处理器重载的方法 (Link)
添加了直接使用DL4J层指定“固定”层的支持(而不是使用layerspace,即使对于没有超参数的层也是如此) (Link)
添加 LogUniformDistribution (Link)
分数函数的改进;增加了ROC分数函数 (Link)
增加学习率调度支持 (Link)
为 ParameterSpace<Double>
和 ParameterSpace<Integer>
添加数学操作 (Link)
改进了失败任务执行的日志记录 (Link)
修复UI JSON序列化 (Link)
将保存的模型文件重命名为model.bin (Link)
修复使用非线程安全候选/参数空间线程问题 (Link)
Lombok不再作为传递依赖项包含 (Link)
根据DL4J更新器API的更改:旧的更新器配置(learningRate、momentum等)方法已被删除。使用 .updater(IUpdater)
或 .updater(ParameterSpace<IUpdater>)
方法代替
为A3C增加对LSTM层的支持
修复A3C,使其使用新的 ActorCriticLoss
正确使用随机性
修复QLearning
失败的情况(非平面输入、不完整序列化、不正确的归一化)
用异步算法修HistoryProcessor
的逻辑和图像预处理失败
整理并更正统计数据的输出,还允许使用IterationListener
修复妨碍CUDA高效执行的问题
使用NeuralNet.getNeuralNetworks()
, Policy.getNeuralNet()
和方便的Policy
构造函数提供对更多内部结构的访问
Add MDPs for ALE (Arcade Learning Environment) and MALMO to support Atari games and Minecraft为ALE(街机学习环境)和MALMO添加mdp以支持Atari游戏和Minecraft
为Doom更新MDP以允许使用最新版本的VizDoom
First release of ScalNet Scala API, which closely resembles Keras' API.
可以用sbt和maven构建。
支持与DL4J的MultiLayerNetwork
相对应的Keras启发的 Sequential模型和与ComputationGraph
相对应的 Model
项目结构与DL4J模型导入模块和Keras紧密结合。
支持以下层: Convolution2D, Dense, EmbeddingLayer, AvgPooling2D, MaxPooling2D, GravesLSTM, LSTM, 双向层包装器, Flatten, Reshape。此外, DL4J OutputLayers 被支持。
Scala 2.12 支持
Deeplearning4J
修复了0.9.0中版本依赖项不正确的问题
添加 EmnistDataSetIterator Link
使用softmax对LossMCXENT / LossNegativeLogLikelihood的数值稳定性改进(应使用非常大的激活减少NaNs)
ND4J
为ND4J, DL4J, RL4J, Arbiter, DataVec添加运行时版本检查 Link
已知问题
Deeplearning4j:使用Evaluation类无参构造函数(即new Evaluation())可能导致accuracy/stats报告为0.0。其他评估类构造函数和ComputationGraph/MultiLayerNetwork.evaluate(DataSetIterator)方法按预期工作。
这也会影响Spark(分布式)评估:解决方法是sparkNet.evaluate(testData);
和 sparkNet.doEvaluation(testData, 64, new Evaluation(10))[0];
, 其中10是要使用的类数,64是要使用的评估小批量大小。
SequenceRecordReaderDataSetIterator对每个数据集应用两次预处理器(例如归一化)(可能的解决方法:使用RecordReaderMultiDataSetIterator + MultiDataSetWrapperIterator)
迁移学习:计算图可能错误地将l1/l2正则化(在FinetuneConfiguration中定义)应用于冻结层。解决方法:在FineTuneConfiguration上设置0.0 l1/l2,在新的/非冻结层上直接设置所需的l1/l2。请注意,使用迁移学习的多层网络似乎不受影响。
Deeplearning4J
添加了工作区功能(更快的训练性能+更少的内存) Link
ParallelInference被添加-使用内部批处理和队列请求的服务器推理包装器 Link
除了现有的参数平均模式之外,ParallelWrapper现在还可以与梯度共享一起工作 Link
VPTree 性能显著提高
增加了CacheMode网络配置选项-以牺牲额外的内存使用为代价提高了CNN和LSTM的性能 Link
添加LSTM层,用CUDNN支持链接(注意到现有的GraveLSTM实现不支持CUDNN)
带有预训练ImageNet、MNIST和VGG-Face权重的新型本地模型动物园 Link
卷积性能改进,包括激活缓存
现在支持自定义/用户定义的更新器 Link
评估改进
EvaluationBinary, ROCBinary 类被添加 : 二进制多类网络的评估(sigmoid + xent 输出层 ) Link
Evaluation和其他工具现在有G-Measure和Matthews相关系数支持;还有对Evaluation类度量的宏+微观平均支持 Link
ComputationGraph 与 SparkComputationGraph 增加评估便利方法 (evaluateROC, etc)
ROC和ROCMultiClass支持精确计算(以前:使用阈值计算) Link
ROC类现在支持precision recall曲线计算下的区域;在指定的阈值处获取precision/recall/confusion矩阵(通过PrecisionRecallCurve类)Link
RegressionEvaluation、ROCBinary等现在支持每个输出掩码(除了每个示例/每个时间步掩码)
Evaluation 和 EvaluationBinary: 现在支持自定义分类阈值或成本数组 Link
优化:更新器,偏置计算
ND4J
添加了工作区功能 Link
添加了原生并行排序
新操作被添加: SELU/SELUDerivative, TAD-based comparisons, percentile/median, Reverse, Tan/TanDerivative, SinH, CosH, Entropy, ShannonEntropy, LogEntropy, AbsoluteMin/AbsoluteMax/AbsoluteSum, Atan2
添加了新的距离函数: CosineDistance, HammingDistance, JaccardDistance
DataVec
Spark:将JavaRDD<List<Writable>>
和JavaRDD<List<List<Writable>>
数据保存和加载到Hadoop MapFile和SequenceFile格式的实用程序 Link
TransformProcess和Transforms现在支持NDArrayWritables和NDArrayWritable列
多个新转换类
Arbiter
Arbiter UI: Link
UI现在使用Play 框架,与DL4J UI(取代Dropwizard后端)集成。已修复依赖关系问题/冲突版本。
支持DL4J StatsStorage和StatsStorageRouter机制(FileStatsStorage、通过RemoveUIStatsStorageRouter实现的远程用户界面)
常规UI改进(附加信息、格式修复)
Deeplearning4j
更新器配置方法,如 .momentum(double) 和 .epsilon(double) 已弃用。替换: 使用 .updater(new Nesterovs(0.9))
和 .updater(Adam.builder().beta1(0.9).beta2(0.999).build())
等来配置
DataVec
CsvRecordReader构造函数:现在使用字符作为分隔符,而不是字符串(即,','而不是“,”)
Arbiter
Arbiter UI现在是一个单独的模块,带有Scala版本后缀: arbiter-ui_2.10
and arbiter-ui_2.11
添加迁移学习API Link
Spark 2.0支持(DL4J和DataVec;请参阅下面的迁移说明)
新 ComputationGraph 顶点
L2距离顶点
L2归一化顶点
现在大多数损失函数都支持每输出掩码(对于每输出掩码,使用与标签数组大小/形状相等的掩码数组;以前的掩码功能是针对RNN的每个示例)
L1和L2正则化现在可以针对偏置配置(通过l1Bias和l2Bias配置选项)
评估改进:
DL4J现在有一个IEvaluation类(Evaluation、RegressionEvaluation等都实现了。也允许对Spark进行自定义评估) Link
添加了多个类(一对所有) ROC: ROCMultiClass Link
对于MultiLayerNetwork和SparkDl4jMultiLayer:添加了evaluateRegression、evaluateROC、evaluateROCMultiClass便利方法
为ROC图表添加了HTML导出功能 Link
TSNE重新添加到新UI
训练用户界面:现在可以在没有internet连接的情况下使用(不再依赖外部托管的字体)
UI: “无数据”条件下错误处理的改进
Epsilon配置现在用于Adam和RMSProp更新器
修复双向LSTM+可变长度时间序列(使用掩码)
Spark+Kryo:现在测试序列化,如果配置错误则抛出异常(而不是记录可以忽略的错误)
MultiLayerNetwork 现在,如果未指定名称,则添加默认图层名
DataVec:
JSON/YAML支持数据分析、自定义转换等
对ImageRecordReader进行了重构,以减少垃圾收集负载(从而使大型训练集提高性能)
更快的质量分析。
Arbiter: 添加新的层类型以匹配DL4J
Word2Vec/ParagraphVectors分词与训练的性能改进。
段落向量的批量推理
Nd4j 改进
可用于ND4j的新本地操作: firstIndex, lastIndex, remainder, fmod, or, and, xor.
OpProfiler NAN_PANIC & INF_PANIC 现在还要检查BLAS调用的结果。
Nd4.getMemoryManager() 现在提供了调整GC行为的方法。
Spark引入了Word2Vec/ParagraphVectors参数服务器的Alpha版本。请注意:目前还不推荐用于生产。
CNN推理的性能改进
Spark版本控制方案:随着Spark 2支持的增加,Deeplearning4j和DataVec Spark模块的版本已经改变
对于 Spark 1: 用 <version>0.8.0_spark_1</version>
对于 Spark 2: 用 <version>0.8.0_spark_2</version>
另请注意:支持Spark 2的模块仅支持Scala 2.11。Spark 1模块同时支持Scala 2.10和2.11
UI/CUDA/Linux 问题: Link
JVM退出时的脏关闭可能是CUDA的后端引起的: Link
RBM实现问题 Link
Keras 1D卷积层和池化层还不能导入。将在即将发布的版本中得到支持。
无法导入Keras v2模型配置。将在即将发布的版本中得到支持。
增加变分自动编码器 Link
Keras模型导入的多个修复/改进
为CNN添加了P-norm池化(作为子采样层配置的一部分)
迭代计数持久化:在模型配置中正确存储/持久化 + Spark网络训练的学习率调度修正
LSTM:现在可以配置门激活函数(以前:硬编码为sigmoid)
UI:
增加中文翻译
修复UI+预训练层
添加了与Java 7兼容的stats集合兼容性 Link
前端处理NAN的改进
添加 UIServer.stop() 方法
修复分数与迭代移动平均线(带子采样)
用基于Spring Boot的应用程序解决了Jaxb/Jackson问题
RecordReaderDataSetIterator现在支持对标签使用NDArrayWritable(设置 regression==true;用于多标签分类+图像等)
激活函数(内置):现在使用激活枚举指定,而不是字符串(不推荐使用基于字符串的配置)
RBM 与 AutoEncoder 键修复:
确保在训练前更新和应用视觉偏置。
RBM HiddenUnit是该层的激活函数;因此,根据各自的HiddenUnit建立了反向传播的导数计算。
已修复CUDA后端的RNG性能问题
已修复macOS、powerpc和linux的OpenBLAS问题。
DataVec现在回到了Java 7。
为ND4J/DL4J修复了多个小错误
UI检修:新的训练UI有更多的信息,支持持久性(保存信息并稍后加载),日/韩/俄文支持。用Play框架替换了Dropwizard。 Link
使用Keras配置和训练的模型的导入
支持的模型: Sequential 模型
支持层 : Dense, Dropout, Activation, Convolution2D, MaxPooling2D, LSTM
为CNN添加更多“Same”填充(ConvolutionMode网络配置选项) Link
权重损失函数:损失函数现在支持每个输出权重数组(行向量)
为二进制分类器添加ROC和AUC Link
改进了关于无效配置或数据的错误消息;改进了对两者的验证
新增元数据功能:从数据导入到评估跟踪数据源(文件、行号等)。现在支持从该元数据加载示例/数据的子集。Link
删除了Jackson作为核心依赖项(遮挡);用户现在可以使用Jackson的任何版本
添加了LossLayer:仅应用损失函数的OutputLayer版本(与OutputLayer不同:它没有权重/偏置)
构建三元组嵌入模型所需的功能 (L2 vertex, LossLayer, Stack/Unstack vertices 等)
减少了DL4J和ND4J的“冷启动”初始化/启动时间
Pretrain 默认更改为false,backprop 默认更改为true。在设置网络配置时不再需要设置这些,除非需要更改默认值。
添加了TrainingListener接口(扩展了IterationListener)。提供网络训练时对更多信息/状态的访问 Link
在DL4J和ND4J上修复了许多缺陷
nd4j-native 和 nd4j-cuda 后端的性能改进
独立Word2Vec/ParagraphVectors检修:
性能改进
对PV-DM和PV-DBOW都可用ParaVec推理
添加了并行分词支持,以解决计算量大的分词器。
为在多线程执行环境中更好的重现性引入了本地RNG。
添加了其他RNG调用:Nd4j.choice(),和BernoulliDistribution 操作。
引入了非gpu存储,以将大的东西保存在主机内存中,比如Word2Vec模型。可通过WordVectorSerializer.loadStaticModel()获得
nd4j-native后端性能优化的两个新选项:setTADThreshold(int) & setElementThreshold(int)
升级基于0.6.0到0.7.0的代码库的显著变化:
UI: 新的UI包名称是deeplearning4j-ui_2.10或deeplearning4j-ui_2.11(以前是deeplearning4j UI)。Scala版本后缀是必需的,因为现在正在使用Play 框架(用Scala编写)。
已弃用直方图和流迭代监听器。它们仍然可以工作,但建议使用新的UI Link
DataVec ImageRecordReader:标签现在默认按字母顺序排序,然后根据文件迭代顺序为每个标签分配整数类索引(以前为0.6.0和更早版本)。如果需要,使用.setLabels(List)手动指定顺序。
CNNs: 配置验证现在不那么严格了。使用新的ConvolutionMode选项,0.6.0等同于“Strict”模式,但新的默认值是“Truncate”
有关更多详细信息,请参ConvolutionMode javadoc: Link
CNN和LSTM的Xavier权重初始化更改:Xavier现在可以更好地与原始Glorot论文和其他库对齐。Xavier权重初始化。相当于0.6.0的版本作为XAVIER_LEGACY提供
DataVec: 自定义的RecordReader和SequenceRecordReader类需要其他方法才能实现新的元数据功能。参考如何实现这些方法的现有记录读取器实现。
Word2Vec/ParagraphVectors:
少量新的builder方法:
allowParallelTokenization(boolean)
useHierarchicSoftmax(boolean)
行为更改:批大小:现在批大小还用作sg/cbow执行计算批数量的阈值
自定义层支持
支持自定义损失函数
支持压缩的INDArrays,在海量数据上节省内存
适用于布尔值索引的原生支持
对CUDA联合操作的初步支持
CPU和CUDA后端的显著性能改进
更好地支持使用CUDA和cuDNN以及多gpu集群的Spark环境
新的UI工具:FlowIterationListener和ConfluctionIterationListener,用于更好地洞察NN中的进程
用于性能跟踪的特殊IterationListener实现:PerformanceListener
为ParagraphVectors添加的推理实现,以及使用现有的Word2Vec模型的选项
Deeplearning4J api上的文件大小减小很多
nd4j-cuda-8.0
后端现在可用于cuda 8 RC
新增多个内置损失函数
自定义预处理器支持
提高Spark训练实施的性能
使用InputType功能改进网络配置验证
FP16对CUDA的支持
为多gpu提供更好的性能
包括可选的P2P内存访问支持
对时间序列和图像的归一化支持
对标签的归一化支持
移除Canova并转移到DataVec: Javadoc, Github Repo
大量的错误修复
Spark 改进
独立和Spark最初的多GPU支持是可行的
显著地重构了Spark API
添加了CuDNN包装器
ND4J的性能改进
引入 DataVec: 许多新的功能,用于转换,预处理,清理数据。(这代替了Canova)
用现有数据馈送神经网络的新DataSetIterators:现有ExistingDataSetIterator,Floats(Double)DataSetIterator, IteratorDataSetIterator
Word2Vec和ParagraphVectors的新学习算法:CBOW和PV-DM
新的本地操作以获得更好的性能: DropOut, DropOutInverted, CompareAndSet, ReplaceNaNs
默认情况下为多层网络和计算图启用影异步数据集预取
使用JVM GC和CUDA后端更好地处理内存,从而显著降低内存占用
ScalNet Scala API (WIP!)
与Keras共享的标准NN配置文件
CGANs
模型可解释性