2.6 深度学习中的 JavaScript
本节将介绍深度学习领域所涉及的前端知识,包括深度学习中的 JavaScript 数据类型和 JavaScript 异步编程。
2.6.1 JavaScript 数据类型
深度学习中基本的数据结构是张量,高效的数据结构对任何一个深度学习项目都非常重要。 在 C/C++中,我们可以通过数组来高效地存储一些集合数据并实现快速访问;在 Python 中, 我们可以通过 NumPy 中的 NDArray 对象来实现此功能。NDArray 对象是一系列同类型数据的 集合,用于存放同类型元素的多维数组。
深度学习中支持的 JavaScript 数据类型是 TypedArray,它是一种介于原始数组与 NDArray 之间的数据结构。在现代浏览器中有 11 种类型的 TypedArray,如表 2-8 所示。
接下来,介绍 ArrayBuffer 及访问 ArrayBuffer 的两种方法——TypedArray 和 DataView。
1.ArrayBuffer
ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区,它是一个字节数 组。由于 ArrayBuffer 仅仅是内存上的二进制缓冲区,因此它并不提供任何操作数据(读取数 据、写入数据)的方法,即我们并不能直接操作 ArrayBuffer 的内容,而要通过 TypedArray 或 DataView 对象来操作。它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写 缓冲区中的内容,如代码清单 2-22 所示。
代码清单 2-22
constbuffer=newArrayBuffer(4) console.log(buffer.byteLength) //4
2.TypedArray
TypedArray(类型化数组)对象描述了一个底层的二进制数据缓冲区的类数组视图。 TypedArray 定义了如何访问底层的 ArrayBuffer,实际上用于存储数据的数据结构是 ArrayBuffer, 没有名为 TypedArray 的全局属性,也没有名为 TypedArray 的构造函数。示例代码如代码 清单 2-23 所示。
代码清单 2-23
consttypedArray1=newInt8Array(8); typedArray1[0] =128; consttypedArray2=newInt8Array(typedArray1); typedArray2[1] =20; console.log(typedArray1); // 期望输出: Int8Array [-128, 0, 0, 0, 0, 0, 0, 0]console.log(typedArray2); // 期望输出: Int8Array [-128, 20, 0, 0, 0, 0, 0, 0]
由于 Int8Array 中单个元素值的范围是−128~127,因此当指定 typedArray1 数组的第一个元素 为 128 时,该值超出范围,于是会从另一边界重新开始循环,即值为−128。
3.DataView
DataView 是一个可以从二进制 ArrayBuffer 对象中读写多种数值类型的底层接口,在使用 它时,无须考虑不同平台的字节序问题,如代码清单 2-24 所示。
代码清单 2-24
varbuffer=newArrayBuffer(4) newDataView(buffer).setInt16(0,42,true) console.log(newUint8Array(buffer))
我们首先在代码清单 2-24 中创建了 4 字节大小的 ArrayBuffer,然后将已经创建的 ArrayBuffer 作为数据源并创建 DataView 对象,并通过 setInt16()方法创建起始位置为 0、值为 42 的 16 位 整数。我们还指定 setInt16()方法的参数 littleEndian 为 true,即采用小端字节序(低位字节放在 内存的低地址端,高位字节放在内存的高地址端)。该参数的默认值为 false,即默认采用大端 字节序。上述代码的运行结果如下。
Uint8Array [42, 0, 0, 0]