TensorBuffer

公共抽象类 TensorBuffer
已知的直接子类

表示模型输入或其输出的数据缓冲区。

公共方法

静态 TensorBuffer
createDynamic(DataType dataType)
使用指定的 DataType 创建空的动态 TensorBuffer
静态 TensorBuffer
createFixedSize(int[] shape, DataType dataType)
使用指定的 shapeDataType 创建 TensorBuffer
静态 TensorBuffer
createFromTensorBuffer 缓冲区,DataType dataType)
使用指定的 DataType 从另一个数据创建深层复制数据的 TensorBuffer
ByteBuffer
getBuffer()
返回数据缓冲区。
abstract DataType
getDataType()
返回该缓冲区的数据类型。
整型
getFlatSize()
获取缓冲区的 FlatSize。
abstract float[]
getFloatArray()
返回此缓冲区中存储的值的浮点数组。
抽象 浮点数
getFloatValue(int absIndex)
返回指定索引处的浮点值。
abstract int[]
getIntArray()
返回此缓冲区中存储的值的 int 数组。
abstract int
getIntValue(int absIndex)
返回指定索引处的 int 值。
整型 []
getShape()
获取当前形状。
abstract int
getTypeSize()
返回数组中单个元素的字节数。
布尔值
isDynamic()
如果 TensorBuffer 是动态大小(可以任意调整大小),则返回 。
抽象 void
loadArray(int[] src, int[] shape)
将一个 int 数组加载到具有特定形状的缓冲区中。
抽象 void
loadArray(float[] src, int[] shape)
将一个具有特定形状的浮点数数组加载到此缓冲区中。
void
loadArray(float[] src)
将浮点数组加载到此缓冲区。
void
loadArray(int[] src)
将 int 数组加载到此缓冲区。
void
loadBufferByteBuffer 缓冲区)
将字节缓冲区加载到此 TensorBuffer
void
loadBufferByteBuffer 缓冲区,int[] 形状)
将一个字节缓冲区加载到此 TensorBuffer 中(具有特定形状)。

继承的方法

公共方法

public static TensorBuffer createDynamic (DataType dataType)

使用指定的 DataType 创建空的动态 TensorBuffer。所创建的 TensorBuffer 的形状为 {0}。

在加载不同缓冲区大小的数组或数据缓冲区时,动态 TensorBuffer 会重新分配内存。下面是一些示例:

 // Creating a float dynamic TensorBuffer:
 TensorBuffer tensorBuffer = TensorBuffer.createDynamic(DataType.FLOAT32);
 // Loading a float array:
 float[] arr1 = new float[] {1, 2, 3};
 tensorBuffer.loadArray(arr, new int[] {arr1.length});
 // loading another float array:
 float[] arr2 = new float[] {1, 2, 3, 4, 5};
 tensorBuffer.loadArray(arr, new int[] {arr2.length});
 // loading a third float array with the same size as arr2, assuming shape doesn't change:
 float[] arr3 = new float[] {5, 4, 3, 2, 1};
 tensorBuffer.loadArray(arr);
 // loading a forth float array with different size as arr3 and omitting the shape will result
 // in error:
 float[] arr4 = new float[] {3, 2, 1};
 tensorBuffer.loadArray(arr); // Error: The size of byte buffer and the shape do not match.
 

参数
dataType 要创建的 TensorBuffer 的数据类型。

public static TensorBuffer createFixedSize (int[] shape, DataType dataType)

使用指定的 shapeDataType 创建 TensorBuffer。下面是一些示例:

 // Creating a float TensorBuffer with shape {2, 3}:
 int[] shape = new int[] {2, 3};
 TensorBuffer tensorBuffer = TensorBuffer.createFixedSize(shape, DataType.FLOAT32);
 
 // Creating an uint8 TensorBuffer of a scalar:
 int[] shape = new int[] {};
 TensorBuffer tensorBuffer = TensorBuffer.createFixedSize(shape, DataType.UINT8);
 
 // Creating an empty uint8 TensorBuffer:
 int[] shape = new int[] {0};
 TensorBuffer tensorBuffer = TensorBuffer.createFixedSize(shape, DataType.UINT8);
 

固定大小的 TensorBuffer 大小一经创建便无法更改。

参数
shape 要创建的 TensorBuffer 的形状。
dataType 要创建的 TensorBuffer 的数据类型。
抛出
NullPointerException 如果 shape 为 null。
IllegalArgumentException 如果 shape 包含非正元素。

public static TensorBuffer createFrom TensorBuffer 缓冲区,DataType dataType)

使用指定的 DataType 从另一个数据创建深层复制数据的 TensorBuffer

参数
缓存空间 TensorBuffer复制来源。
dataType 新创建的TensorBuffer的预期DataType
抛出
NullPointerException 如果 buffer 为 null。

public ByteBuffer getBuffer ()

返回数据缓冲区。

public abstract DataType getDataType ()

返回该缓冲区的数据类型。

public int getFlatSize ()

获取缓冲区的 FlatSize。

抛出
IllegalStateException 在底层数据已损坏时

public abstract float[] getFloatArray ()

返回此缓冲区中存储的值的浮点数组。如果缓冲区的类型与浮点数不同,这些值将转换为浮点数。例如,TensorBufferUint8 中的值将从 uint8 转换为 float。

public abstract float getFloatValue (int absIndex)

返回指定索引处的浮点值。如果缓冲区的类型与浮点数不同,则该值将转换为浮点数。例如,从 TensorBufferUint8 读取值时,该值将首先被读取为 uint8,然后将从 uint8 转换为 float。

 For example, a TensorBuffer with shape {2, 3} that represents the following array,
 [[0.0f, 1.0f, 2.0f], [3.0f, 4.0f, 5.0f]].

 The fourth element (whose value is 3.0f) in the TensorBuffer can be retrieved by:
 float v = tensorBuffer.getFloatValue(3);
 

参数
absIndex 要读取的值的绝对索引。

public abstract int[] getIntArray ()

返回此缓冲区中存储的值的 int 数组。如果缓冲区的类型与 int 不同,值将被转换为 int,并且可能会失去精度。例如,从值为 {400.32f, 23.04f} 的 TensorBufferFloat 获取 int 数组,输出结果为 {400, 23}。

public abstract int getIntValue (int absIndex)

返回指定索引处的 int 值。如果缓冲区的类型与 int 的类型不同,该值将转换为 int。例如,从 TensorBufferFloat 读取值时,系统会先将该值读取为 float,然后再从 float 转换为 int。可能会造成精度损失。

 For example, a TensorBuffer with shape {2, 3} that represents the following array,
 [[0.0f, 1.0f, 2.0f], [3.0f, 4.0f, 5.0f]].

 The fourth element (whose value is 3.0f) in the TensorBuffer can be retrieved by:
 int v = tensorBuffer.getIntValue(3);
 Note that v is converted from 3.0f to 3 as a result of type conversion.
 

参数
absIndex 要读取的值的绝对索引。

public int[] getShape ()

获取当前形状。(在此处返回一个副本以避免意外修改。)

抛出
IllegalStateException 在底层数据已损坏时

public abstract int getTypeSize ()

返回数组中单个元素的字节数。例如,浮点缓冲区将返回 4,字节缓冲区将返回 1。

public 布尔值 isDynamic ()

如果 TensorBuffer 是动态大小(可以任意调整大小),则返回 。

public abstract void loadArray (int[] src, int[] shape)

将一个 int 数组加载到具有特定形状的缓冲区中。如果缓冲区的类型与 int 不同,这些值会先转换为缓冲区的类型,然后再加载到缓冲区中,并且可能会丢失精度。例如,将值为 {400, -23} 的 int 数组加载到 TensorBufferUint8 中时,值将被限制为 [0, 255],然后由 {255, 0} 转换为 uint8。

参数
src 要加载的源数组。
shape src 表示的张量的形状。
抛出
NullPointerException 如果 src 为 null。
NullPointerException 如果 shape 为 null。
IllegalArgumentException 如果要加载的数组的大小与指定形状不匹配。

public abstract void loadArray (float[] src, int[] shape)

将一个具有特定形状的浮点数数组加载到此缓冲区中。如果缓冲区的类型与浮点数不同,则值会在加载到缓冲区之前转换为缓冲区的类型,并且可能会丢失精度。例如,将一个浮点型数组加载到值为 {400.32f, -23.04f} 的 TensorBufferUint8 中,值将被限制为 [0, 255],然后由 {255, 0} 转换为 uint8。

参数
src 要加载的源数组。
shape src 表示的张量的形状。
抛出
NullPointerException 如果 src 为 null。
NullPointerException 如果 shape 为 null。
IllegalArgumentException 如果要加载的数组的大小与指定形状不匹配。

public void loadArray (float[] src)

将浮点数组加载到此缓冲区。如果缓冲区的类型与浮点数不同,则值会在加载到缓冲区之前转换为缓冲区的类型,并且可能会丢失精度。例如,将一个浮点型数组加载到值为 {400.32f, -23.04f} 的 TensorBufferUint8 中,这些值将会被限制为 [0, 255],然后由 {255, 0} 转换为 uint8。

使用此方法时,假设 src 的形状与此 TensorBuffer 的形状相同。因此,对于固定尺寸和动态 TensorBufferbuffer (src.length) 的尺寸应始终与此 TensorBuffer 的平面尺寸保持一致。如果 src 的形状不同,请使用 loadArray(float[], int[])

参数
src 要加载的源数组。

public void loadArray (int[] src)

将 int 数组加载到此缓冲区。如果缓冲区的类型与 int 不同,这些值会先转换为缓冲区的类型,然后再加载到缓冲区中,并且可能会丢失精度。例如,将值为 {400, -23} 的 int 数组加载到 TensorBufferUint8 中时,值将限制为 [0, 255],然后由 {255, 0} 转换为 uint8。

使用此方法时,假设 src 的形状与此 TensorBuffer 的形状相同。因此,对于固定尺寸和动态 TensorBufferbuffer (src.length) 的尺寸应始终与此 TensorBuffer 的平面尺寸保持一致。如果 src 的形状不同,请使用 loadArray(int[], int[])

参数
src 要加载的源数组。

public void loadBuffer (ByteBuffer 缓冲区)

将字节缓冲区加载到此 TensorBuffer。缓冲区大小必须与此 TensorBuffer 的平面大小一致。

使用此方法时,假设 buffer 的形状与此 TensorBuffer 的形状相同。因此,对于固定尺寸和动态 TensorBufferbuffer (buffer.limit()) 的尺寸应始终与此 TensorBuffer 的平面尺寸保持一致。如果 buffer 的形状不同,请使用 loadBuffer(ByteBuffer, int[])

重要提示:加载的缓冲区是一个引用。请勿修改。出于性能方面的考虑,我们不会在此处创建副本,但如果需要修改,请创建副本。

为获得最佳性能,请始终加载直接的 ByteBuffer 或由数组支持的 ByteBuffer

如果 buffer 为只读,我们会采用写入时复制策略来提高性能。

参数
缓存空间 要加载的字节缓冲区。

public void loadBuffer (ByteBuffer buffer, int[] shape)

将一个字节缓冲区加载到此 TensorBuffer 中(具有特定形状)。

重要提示:加载的缓冲区是一个引用。请勿修改。出于性能方面的考虑,我们不会在此处创建副本,但如果需要修改,请创建副本。

为了获得最佳性能,请始终加载直接 ByteBuffer 或由数组支持的 ByteBuffer

参数
缓存空间 要加载的字节缓冲区。
shape
抛出
NullPointerException 如果 buffer 为 null。
IllegalArgumentException 如果 buffertypeSize 的大小不一致或 bufferflatSize 的大小不一致。