前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pytorch和tensorflow的爱恨情仇之基本数据类型

pytorch和tensorflow的爱恨情仇之基本数据类型

作者头像
西西嘛呦
发布2020-10-10 17:25:09
2.9K0
发布2020-10-10 17:25:09
举报
文章被收录于专栏:数据分析与挖掘

自己一直以来都是使用的pytorch,最近打算好好的看下tensorflow,新开一个系列:pytorch和tensorflow的爱恨情仇(相爱相杀。。。)

无论学习什么框架或者是什么编程语言,最基础的就是其基本的数据类型了,接下来我们就一一看看吧。

pytorch版本:0.4.1,准备之后换成1.x版本的。

tensorflow版本:1.15.0,虽然目前tensorflow已经出到2.x版本了,但据说2.x版本的还存在一些bug,就使用目前的1.x版本的了。

1、python基本数据类型

数字型:整型、浮点型、布尔型、复数型。

非数字型:字符串、列表、元组、字典。

使用type可以查看变量的类型:type(变量名)

2、numpy中的数据类型

名称

描述

bool_

布尔型数据类型(True 或者 False)

int_

默认的整数类型(类似于 C 语言中的 long,int32 或 int64)

intc

与 C 的 int 类型一样,一般是 int32 或 int 64

intp

用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)

int8

字节(-128 to 127)

int16

整数(-32768 to 32767)

int32

整数(-2147483648 to 2147483647)

int64

整数(-9223372036854775808 to 9223372036854775807)

uint8

无符号整数(0 to 255)

uint16

无符号整数(0 to 65535)

uint32

无符号整数(0 to 4294967295)

uint64

无符号整数(0 to 18446744073709551615)

float_

float64 类型的简写

float16

半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位

float32

单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位

float64

双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位

complex_

complex128 类型的简写,即 128 位复数

complex64

复数,表示双 32 位浮点数(实数部分和虚数部分)

complex128

复数,表示双 64 位浮点数(实数部分和虚数部分)

numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。

这里简要的看下例子,一般情况下我们是这么定义一个数组的:

当然,我们也可以使用如下方式定义:先指定数组中元素的类型,再创建数组

为什么我们要这么定义呢,这么定义不是没有第一种简便吗?这是因为,通过这种方式,我们可以定义自己的数据类型:

这里的i1指代的是int8,

每个内建类型都有一个唯一定义它的字符代码,如下:

字符

对应类型

b

布尔型

i

(有符号) 整型

u

无符号整型 integer

f

浮点型

c

复数浮点型

m

timedelta(时间间隔)

M

datetime(日期时间)

O

(Python) 对象

S, a

(byte-)字符串

U

Unicode

V

原始数据 (void)

于是乎,请看以下例子:

说到数据类型,就不得不涉及到数据类型之间的转换,自然而然首先想到的是通过修改dtype的类型来修改数据的类型,但是这存在一些问题,请看以下例子:

代码语言:javascript
复制
>>> a=np.array([1.1, 1.2])
>>> a.dtype
dtype('float64')
>>> a.dtype=np.int16
>>> a.dtype
dtype('int16') 
>>> a
array([-26214, -26215, -26215,  16369,  13107,  13107,  13107,  16371], dtype=int16)
#原来float64相当于4个int16的位宽,这样强制转换后会将他们直接拆开成4个数,
#因此原来的两个float64成了8个int16

我们要使用astype来修改数据类型,看一下例子:

代码语言:javascript
复制
>>> a=np.array([1.1, 1.2])
>>> a.dtype
dtype('float64')
>>> a.astype(np.int16)
array([1, 1], dtype=int16)
>>> a.dtype
dtype('float64') #a的数据类型并没有变
>>> a=a.astype(np.int16) #赋值操作后a的数据类型变化
>>> a.dtype
dtype('int16')
>>> a
array([1, 1], dtype=int16)

参考:

https://www.runoob.com/numpy/numpy-dtype.html

https://blog.csdn.net/miao20091395/article/details/79276721

3、pytorch中的数据类型

看以下例子:默认使用的数据类型是torch.float32

当然,你也可以指定生成张量的类别,通过以下方式:

在多数情况下,我们都会使用pytorch自带的函数建立张量,看以下例子:

通过以下两种方式可以查看张量的数据类型:

接下来还是要看下数据类型之间的转换,主要有三点:张量之间的数据类型的转换、张量和numpy数组之间的转换、cuda张量和cpu张量的转换

(1) 不同张量之间的类型转换

直接使用(.类型)即可:

我们还可以使用type()来进行转换:

我们同样可以使用type_as()将某个张量的数据类型转换为另一个张量的相同的数据类型:

(2)张量和numpy之间的转换

将numpy数组转换为张量:使用from_numpy()

将张量转换为numoy数组:使用.numpy()

(3) cuda类型和cpu类型之间的转换

cpu类型转换成cuda类型:

a.cuda()或者a.to(device):这里的device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

cuda类型转换为cpu类型:

a.cpu()

这里需要提一句的是,要先将cuda类型转换为cpu类型,才能进一步将该类型转换为numpy类型。

3、tensorflow基本数据类型

定义一个张量:

使用tf.constant建立一个常量,注意:常量是不进行梯度更新的。

(1)张量之间的类型转换:可以使用tf.to_类型()或者tf.cast(),不过前者将要被移除,最好使用tf.cast()

(2) 张量和numpy之间的类型转换

numpy转张量:使用tf.convert_to_tensor()

张量转numpy:由Session.runeval返回的任何张量都是NumPy数组。

(3)tensorflow好像不存在什么gpu张量和cpu张量类型

如果有什么错误还请指出,有什么遗漏的还请补充,会进行相应的修改。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档