pytorch和tensorflow的爱恨情仇之基本数据类型
自己一直以来都是使用的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的类型来修改数据的类型,但是这存在一些问题,请看以下例子:
>>> 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来修改数据类型,看一下例子:
>>> 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.run
或eval
返回的任何张量都是NumPy数组。
(3)tensorflow好像不存在什么gpu张量和cpu张量类型
如果有什么错误还请指出,有什么遗漏的还请补充,会进行相应的修改。
- 如何使用Python读取大文件
- 介绍一种非常好用汇总数据的方式GROUPING SETS
- 史上最大的CPU Bug(幽灵和熔断的OS&SQLServer补丁)
- 数据库副本的自动种子设定(自增长)
- Git 项目推荐 | 基于go+protobuff 实现的分布式
- ReflectASM-invoke,高效率java反射机制原理
- Web应用渗透测试-本地文件包含
- shiro权限控制(二):分布式架构中shiro的实现
- Groovy实现原理分析——准备工作
- HBCTF第一场2个pwn题的简单分析
- ACM竞赛之输入输出(以C与C++为例)
- 能让程序做的事情坚决不用人来做——批量修复markdownlint MD034警告
- swift demo1 tableview
- Swift Alamofire
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法