为什么用tensor不用array?
在DL的科研和工程中,对数据的操作是一个重要的环节,其中最常用的工具是Numpy和Pytorch。Numpy一个强大的数据操作的工具,但是它不能在GPU上运行,只有将Numpy中的ndarray
转换成tensor
, 才能在GPU上运行。所以我们在必要的时候,需要对ndarray
和tensor
进行操作,同时由于list
是一种我们在数据读取中经常会用到的数据结构,所以对于list
的操作也是经常用到的一种操作。下图就总结了它们之间互相转换的基本的操作。
一、初始化
除了不同数据之间的转换,我们有的时候还需要初始化一些数据,那么我们在总结一些创建数据的方法
1. list
l = list() # create the empty list
l_1 = [1,2,3] # create the
2.ndarray
但是对于我们平时的使用来说,只有这些基本的操作是远远不够的。还有一些重要的细节需要我们去注意,以及一些稍微高端的数据操作的技巧。下面我们就来一一介绍。
二、重要的细节
对于数据转换来说,其中比较重要的一部分就是要准确的转换数据的类型。如果在一开始时候没有注意这个问题,那么虽然当时模型在训练的时候不会出错,但是运行到后面一些对数据类型敏感的操作的时候,就会出现令人匪夷所思的问题,这个时候再去debug就会耗费大量的时间。所以我们在一开始就需要明白自己需要的是哪种数据类型。对于ndarray
和tensor
来说,我们可以通过指定dtype
的参数来帮助我们准确的转换,但对于与list
相关的数据转换,我们就需要多个心眼去判断我们是否已经准确的转换。说来惭愧,作为一个计算机科班出身的人,笔者一开始并没有注意到这一点,导致自己在炼丹的过程中遇到了不少让人吐血的坑。那么,我们接下来就通过几个表格来了解一下,list
、ndarray
和tensor
都分别有哪些数据类型。
来自于菜鸟教程的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)
但是这样的操作一定会增加额外的消耗,所以建议大家再存储的时候就将数据存成可以直接使用的类型