ND4J的基本操作
一、ND4J的在内存中的存储结构
对于ND4J而言,所有的数据都存储在堆外内存,是一维的连续内存,INDArray 只是指向了这片连续的内存空间,把连续内存映射成张量,ND4J定义了两种排序规则:C order和F order,C order表示行优先,F order表示列优先。下图展示了ND4J的内存存储。
上图可以看出,不过张量是几维,对应的物理存储都是一维的连续内存空间,NDArray在指向这片连续的地址,这正是ND4J强大的地方,对于各种矩阵操作,例如:矩阵转置、矩阵加标量等等操作,都可以轻而易举的实现,而不用花力气去dup一个巨型数组,高性能也表现在这种优雅的设计方式上。
二、ND4J的基本操作
1、加法
INDArray add(INDArray other) :元素对应相加,返回的张量是拷贝出来的
INDArray addi(INDArray other) :元素对应相加,与上面不同的是,返回值不是拷贝出来的新数组,而是用计算结果替换原内存数据
INDArray add(Number n):每个元素加上一个标量
INDArray addi(Number n):每个元素加上一个标量,并覆盖原数组
2、减法
INDArray sub(Number n):每个元素减去一个标量
INDArray subi(Number n):每个元素减去标量,并覆盖原数组
INDArray sub(INDArray other):对应元素相减
INDArray subi(INDArray other):对应元素相减,并覆盖原数组
3、乘法
乘法分两种,对应元素相乘和矩阵乘法
INDArray mul(INDArray other):对应元素相乘
INDArray muli(INDArray other):对应元素相乘,并覆盖原数组
INDArray mmul(INDArray other):矩阵相乘
INDArray mmuli(INDArray other):矩阵相乘,并覆盖原数组
4、除法
INDArray div(INDArray other):对应元素相除
INDArray divi(INDArray other):对应元素相除并覆盖原数组
INDArray div(Number n):每个元素除以一个标量
INDArray divi(Number n):每个元素除以一个标量,并覆盖原数组
5、矩阵转置
INDArray transpose()
INDArray transposei()
总结一下:后面以i结尾的方法,表示in place,也就是会覆盖原内存空间的数据,和”传引用“一个意思
6、张量创建
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):随机对应形状的张量
7、张量设置值
INDArray putScalar(int[] i, double value):对应位置设置标量
INDArray putScalar(int row, int col, double value):对应行列处设置标量
INDArray put(INDArrayIndex[] indices, INDArray element):对应维度处设置INDArray
8、其他操作
INDArray reshape(int... newShape):重新定义张量形状
这里只是列举了ND4J的一些常用操作,ND4J还定义了很多对应张量灵活的操作,例如求和、求平均、求最大值、求最小值、BooleanIndexing根据条件替换张量值、常用函数操作(sigmoid、tanh等等),要了解更多的详情,可以深入去看DL4J的example或者单元测试,去体验这个优秀的张量运算库。
---------------------------------------------------------------------------------------------------------
快乐源于分享。
此博客乃作者原创, 转载请注明出处

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
CentOS 8.0 最新构建状态公布,或于数周后发布
虽然红帽已在上个月发布RHEL 8 正式版本,但更多的开发者却是在等待 CentOS 8.0,不过大家再着急也不会改变 CentOS 8 的发布时间。目前看来,发布 CentOS 8.0 仍需等待几周。 关于 CentOS 8 的构建状态页面显示,已经开始构建系统,但作为构建的一部分,需要修复上一步骤中存在的问题。 在另一篇总结当前 CentOS 8 状态的博客文章中,构建传统的 RHEL8 RPM 软件包以及更新的模块/流方面正在取得进展。Koji 用于构建 RPM,而附带 Mbox 的模块构建服务(Module Build Service)正在处理模块。 可以在https://git.centos.org找到构成 CentOS 8 RPM和模块的来源 一如既往地,CentOS 团队表示不会预测 CentOS 8 何时发布 GA 版本,但会在它准备好后立即发布。 一些统计数据如下: 非模块化软件包:2542个 内置软件包:2523个 更新版本:25个 构建失败软件包:17个 模块/流的总数:61个 内置模块:14个 故障模块:0 安全启动填充状态:完成 下一步工作: 完成所有组件构建...
-
下一篇
Apache Ignite上的TensorFlow
任何深度学习都是从数据开始的,这是关键点。没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要。在做研究、构建新的神经网络架构、以及做实验时,会习惯于使用最简单的本地数据源,通常是不同格式的文件,这种方法确实非常有效。但有时需要更加接近于生产环境,那么简化和加速生产数据的反馈,以及能够处理大数据就变得非常重要,这时就需要Apache Ignite大展身手了。 Apache Ignite是以内存为中心的分布式数据库、缓存,也是事务性、分析性和流式负载的处理平台,可以实现PB级的内存级速度。借助Ignite和TensorFlow之间的现有集成,可以将Ignite用作神经网络训练和推理的数据源,也可以将其用作分布式训练的检查点存储和集群管理器。 分布式内存数据源 作为以内存为中心的分布式数据库,Ignite可以提供快速数据访问,摆脱硬盘的限制,在分布式集群中存储和处理需要的所有数据,可以通过使用Ignite Dataset来利用Ignite的这些优势。 注意Ignite不只是数据库或数据仓库与TensorFlow之间ETL管道中的一个步骤,它还是一个HTAP(混...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器