slice方法详解
2021-02-16 17:51:50

该方法经常用在对数据的预处理过程中,但是关于slice()方法切割的具体思路,官网的教程实在令人费解,所以在本文中我将对slice()方法做下总结,请看本文。

参考资料

  1. TensorFlow.js文档:https://js.tensorflow.org/api/latest/

1. 构造数据

在本小节中我将介绍6种创建不同维度张量的方法,请看示例:

  1. tf.tensor(values,shape?,dtype?)
    该方法可以构造出一个给定值、形状和数据类型的张量,请看参数介绍:

values:该参数表示张量的值,可以是 nested array of numbers、flat array或TypedArray;
shape:该参数表示张量的形状,为可选参数;
dtype:该参数表示张量的数据类型,为可选参数,其值可以为float32int32boolcomplex64string

接下来,我们看几个简单的案例,请看代码:

  • Pass an array of values to create a vector.

    tf.tensor([1, 2, 3, 4]).print();

    请看结果:

    Tensor
        [1, 2, 3, 4]
  • Pass a nested array of values to make a matrix or a higher dimensional tensor.

    tf.tensor([[1, 2], [3, 4]]).print();

    请看结果:

    Tensor
        [[1, 2],
         [3, 4]]
  • Pass a flat array and specify a shape yourself.

    tf.tensor([1, 2, 3, 4], [2, 2]).print();

    请看结果:

    Tensor
        [[1, 2],
         [3, 4]]
  1. tf.scalar(value,dtype?)
    该方法可以构造出给定值和数据类型的0维张量,即一个标量,请看参数介绍:

    value:该参数表示标量的值,其值可以是numberbooleanstringUnit8Array
    dtype:该参数表示张量的数据类型,为可选参数,其值可以为float32int32boolcomplex64string

接下来,我们看一个简单的案例,请看代码:

tf.scalar(3.14).print();

请看结果:

Tensor
    3.140000104904175
  1. tf.tensor1d(values,dtype?)
    该方法可以构造出给定值、形状和数据类型的1维张量,它同样也可以被tf.tensor()方法实现,但是为了保证程序的可读性,更推荐此写法,请看参数介绍:

values:该参数表示张量的值,其值可以是 numbers或TypedArray;
dtype:该参数表示张量的数据类型,为可选参数,其值可以为float32int32boolcomplex64string

接下来,我们看一个简单的案例,请看代码:

tf.tensor1d([1, 2, 3]).print();

请看结果:

Tensor
    [1, 2, 3]
  1. tf.tensor2d(values,shape?,dtype?)
    该方法可以构造出给定值、形状和数据类型的2维张量,它同样也可以被tf.tensor()方法实现,但是为了保证程序的可读性,更推荐此写法,请看参数介绍:

    values:该参数表示张量的值,可以是 nested array of numbers、flat array或TypedArray;
    shape:该参数表示张量的形状,为可选参数;
    dtype:该参数表示张量的数据类型,为可选参数,其值可以为float32int32boolcomplex64string

接下来,我们看几个简单的案例,请看代码:

// Pass a nested array.
tf.tensor2d([[1, 2], [3, 4]]).print();

请看结果:

Tensor
    [[1, 2],
     [3, 4]]
// Pass a flat array and specify a shape.
tf.tensor2d([1, 2, 3, 4], [2, 2]).print();

请看效果:

Tensor
    [[1, 2],
     [3, 4]]
  1. tf.tensor3d(values,shape?,dtype?)
    该方法可以构造出给定值、形状和数据类型的3维张量,它同样也可以被tf.tensor()方法实现,但是为了保证程序的可读性,更推荐此写法,请看参数介绍:

    values:该参数表示张量的值,可以是 nested array of numbers、flat array或TypedArray;
    shape:该参数表示张量的形状,为可选参数;
    dtype:该参数表示张量的数据类型,为可选参数,其值可以为float32int32boolcomplex64string

接下来,我们看几个简单的案例,请看代码:

// Pass a nested array.
tf.tensor3d([[[1], [2]], [[3], [4]]]).print();

请看结果:

Tensor
    [[[1],
      [2]],

     [[3],
      [4]]]
// Pass a flat array and specify a shape.
tf.tensor3d([1, 2, 3, 4], [2, 2, 1]).print();

请看结果:

Tensor
    [[[1],
      [2]],

     [[3],
      [4]]]

2. 切割数据

在第一部分中,我们了解了如何去创建一个张量数据,在本小节中,我们就来介绍一下如何对原张量进行切割,从而取出我们需要的数据,请看方法介绍:
tf.slice(x,begin,size?)

x:被切割的原始张量;
begin:开始切割的位置;
size:切割的大小;

接下来,我们看几个简单的案例,请看代码:

const x = tf.tensor1d([1, 2, 3, 4]);
x.slice([1], [2]).print();

请看结果:

Tensor
    [2, 3]

对于一维张量数据[1,2,3,4],根据slice方法指定的参数我们可以知道,第一个参数[1]表示切割的初始位置,即从原始张量的第二项(对应数值为2,下标索引为1)开始切割;第二个参数[2]表示切割元素的大小,即从原始张量的第二项开始切割,切割大小为2,即所得切割后的张量为[2,3]

接下来,我们再来切割一个二维数据,请看代码:

const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
x.slice([1, 0], [1, 2]).print();

上述代码中,我们创建了一个shape=(2,2)的张量,根据slice()方法指定的参数我们可以知道,begin对应的参数是[1,0]size对应的参数是[1,2],我们在参数解释中对begin参数做了解释,其表示切割的初始位置,故[1,0]表示在2个维度中,每个维度从哪里算起,即第一个维度从第一个元素算起(对应元素为[3,4]),第二个维度从第0个元素开始算起(对应元素为3),参数size表示每个维度的大小,也就是在每个维度取几个元素,对于上述案例,即在第一维度取一个元素,即所取元素为[3,4];第二维度取两个元素,即将[3,4]两个值均切割出来。

3. 文章最后

以上就是本文的所有内容,小伙伴们学会了嘛?快去实践一下吧!更多详情请关注我的更多开源作品:
1. 微信公众号(hahaCoder)

图5 - 微信公众号

2. 微信小程序(hahaAI)

图6 - 微信小程序

3. Github
链接地址:https://github.com/TURBO1002