为什么用tensor不用array?

在DL的科研和工程中,对数据的操作是一个重要的环节,其中最常用的工具是NumpyPytorchNumpy一个强大的数据操作的工具,但是它不能在GPU上运行,只有将Numpy中的ndarray转换成tensor, 才能在GPU上运行。所以我们在必要的时候,需要对ndarraytensor进行操作,同时由于list是一种我们在数据读取中经常会用到的数据结构,所以对于list的操作也是经常用到的一种操作。下图就总结了它们之间互相转换的基本的操作。

一、初始化

除了不同数据之间的转换,我们有的时候还需要初始化一些数据,那么我们在总结一些创建数据的方法

1. list

 l = list() # create the empty list
 l_1 = [1,2,3] # create the 

2.ndarray

 

但是对于我们平时的使用来说,只有这些基本的操作是远远不够的。还有一些重要的细节需要我们去注意,以及一些稍微高端的数据操作的技巧。下面我们就来一一介绍。

二、重要的细节

对于数据转换来说,其中比较重要的一部分就是要准确的转换数据的类型。如果在一开始时候没有注意这个问题,那么虽然当时模型在训练的时候不会出错,但是运行到后面一些对数据类型敏感的操作的时候,就会出现令人匪夷所思的问题,这个时候再去debug就会耗费大量的时间。所以我们在一开始就需要明白自己需要的是哪种数据类型。对于ndarraytensor来说,我们可以通过指定dtype的参数来帮助我们准确的转换,但对于与list相关的数据转换,我们就需要多个心眼去判断我们是否已经准确的转换。说来惭愧,作为一个计算机科班出身的人,笔者一开始并没有注意到这一点,导致自己在炼丹的过程中遇到了不少让人吐血的坑。那么,我们接下来就通过几个表格来了解一下,listndarraytensor都分别有哪些数据类型。

来自于菜鸟教程的python部分来自于Pytorch官网

对于list来说,我们需要保证每一个item都是数字,并不是字符串或者其他的类型才能保证我们可以顺利的转换。如果list中的数据确实是字符串,我们可以使用map()方法,将数据显式地转换成我们想要的数据类型然后在将其转换成ndarray或者tensor。以将字符串转换成int为例,我们可以使用下面的方法:

 import numpy as np
 original = ['1', '2', '3']
 f = lambda x : int(x)
 result = [x for x in map(f, original)]
 a = np.array(result)

但是这样的操作一定会增加额外的消耗,所以建议大家再存储的时候就将数据存成可以直接使用的类型

posted @ 2021-05-31 11:29  雷雷提  阅读(259)  评论(0编辑  收藏  举报