我的pytorch学习笔记
之前一直在keras上厮混,也接触过一点pytorch的张量计算。
按照《20天学会pytorch》这个教程说:
pytorch存在多个层次结构,硬件结构上是C++的框架内核,这点好像大部分深度学习框架几乎都是一致的。
更上一层是pytorch框架提供的内核封装的api op 这一层是对一些张量计算,连接
自动微分计算的实现,提供基础的组件,以及一些封装好的常用的层。
更上面一层就是使用python实现的模型最贱,构建了模型层和损失函数以及有优化器和数据管道。
1.基础的张量操作
一、张量的类型
张量最常见的几种类型就是浮点型,无符号整型
常见数据类型 | pytorch的类型对象 |
---|---|
double双精度 | torch.float64 |
float单精度浮点型 | torch.float32 |
量化浮点型qfloat | torch.float16 这玩意GPU特供 |
long 长整型 | torch.int64 |
int 整型 | torch.int32 |
short短整型 | torch.int16 |
char 字符型 | torch.int8 |
unsign无符号型 | torch.uint8 |
二、张量的创建
除了FloatTensor()
(浮点型张量)DoubleTensor()
(双精度浮点型张量)
HalfTensor()
ByteTensor()
(无符号字节张量)
CharTensor()
(有符号字符张量)ShortTensor()
(短整型张量)
IntTensor()
(整型张量)LongTensor()
(长整型张量)
这类指定类型的张量创建方式,还有从序列对象转换
torch.Tensor()
方式支持使用序列对象来构建浮点型张量,支持的对象包括列表、元组、数组、ndarray之类。
指定大小或者like依照现有张量大小的方式来生成。
Tensor()
zeros()
ones()
full()
tensor_like()
ones_like()
ones_like()
full_like()
empty()
empty_like()
是有点特殊的,张量指定好尺寸,但是内部的填充数据是一些非初始化数据,也就是内存里面的数据,因为这个张量创建的时候默认在内存里面是连续的
随机方法生成张量:
rand
rand_like
生成均匀分布的随机数
randint
randint_like
生成 low
high
之间均匀采样的随机整数
randn
randn_like
标准正态分布随机数
randperm
返回n
到0之间的随机排列 有点类似shuffle
bernoulli
二项伯努利采样随机数
multinomial
多项采样随机数
normal
自己给定标准差std
和均值mean
的正态分布
poisson
泊松分布采样的随机数
tensor()
会根据传入的数据类型自动推断合适张量类型来进行转换
创建特殊张量:
单位张量eye()
创建complex(real,imag)
复数张量 real
实数部分imag
虚数部分
创建polar(abs,angle)
坐标表示的虚数,abs是浮点或者double,angle必须和abs一致
heaviside(input,value)
将等于0的元素映射为value,大于零的全置1,小于0就置为0.
创建一维等差张量linspace(start,end,step)
建议提供steps张量的size
创建指数等差幂张量logsapce(start,end,step,base=10.0)
创建等差张量arange
不包含end 推荐使用这个
创建等差张量range
这个函数未来会被弃用,因为它包含end
从numpy或者其他序列进行转换:
tensor
可以将列表、元组、ndarray 标量转换为张量。如果不指定dtype,会从原始数据类型中推测,requires_grad:bool
参数用来开启自动微分来记录梯度计算。pin_mermory
在使用CPU的时候是不是使用固定内存。
as_tensor()
这个方法不会对传入的tensor做拷贝tensor()
方法会
三、类型转换张量对象使用.float()、int()
之类的方法进行转换 Tensor.type(dtype)
指定转换为特定数据类型 type_as(tensor_x)
转换为张量x的数据类型 四、张量状态信息获取is_tensor
是否是一个张量对象
is_storage()
是不是pytorch的存储对象
is_complex
是不是一个复数对象
is_floating_point
是不是一个浮点数对象
is_nonzero
是不是非0的标量张量
numel
张量含有的元素数量
set_printoptions
对张量的输出信息进行设置
precision
精度默认是4threshold
超出设置的阈值就省略显示,默认是100edgeitems
省略显示的时候每个维度首尾显示几位,默认是3位linewidth
一行数据的字符数量超出linewidth的时候就换行显示profile
默认是pprint 简短显示short 全部显示fullsci_mode
是否启用科学计数法显示 默认None是让框架自己推断
True是一直开启 False是一直关闭
set_flush_denormal
不知道干哈的
set_default_dtype
设置默认的浮点类型(使用推测,也就是不指定dtype的时候有效)
简单来说就是替换float32(单精度浮点型)
get_fault_dtype
获取当前默认的浮点类型
set_default_tensor_type
对Tensor()方法生成的浮点数类型进行设置,也就是替换原始FloatTensor
方法
五、连接 维度变换 切片
对张量的分割不是选取张量的一部分,而是将张量切成多个不同的张量
dsplit
这个所谓的深度分割应该就是按照最后一个维度来分割张量,indices_or_secetions列表不是分割的数量(单个数值则是分成几个分块),而是在它前面进行分割,这个可以是一个张量或者整型胜利列表和元组
tensor_split
张量分割是dsplit
/hsplit
/vsplit
的plus版本 默认是按照第一个维度来切割
对于二维张量来说这个就是vsplit,一维张量就是hsplit
vsplit
这个是所谓的垂直分割(不是按照列分割),是按照列延伸的方向,切成行,输入张量至少是二维以上的
split
按照指定dim来分割指定split_size_or_secetions
大小的张量块 是chunk的升级版
hsplit
这个一维张量时,使用起来和vsplit
效果是一样的,也就是将张量水平分割
chunk
这个只能将张量分为几块,约等于只用整型indices_or_secetions
,但是可以指定维度dim
5.2 切片
index_select
按照dim
上的index
索引来选取出来子张量切片
mask_select
按照给定的布尔张量来选取张量里面的元素,可以筛选元素的方法一起用
take
将张量视作是一维张量来按照一维张量下标index
来选取元素组成新的张量
take_along_dim
按照指定维度dim上的索引indices来选取元素构成新张量
narrow
这个在指定维度dim
上从start
索引开始选取 length
的张量切片
unbind
移除一个维度dim
,然后按照这个维度上的切片,返回一个张量元组。
where
按照condition
选取x
ory
来 这两个张量只能是(浮点)(整型)(复数)
5.3 拼接
cat
连接的几个张量用张量组成的序列传入,这些张量必须在给出的dim上有一样的shape
column_stack
将输入的张量序列中的每一个都转为(numel,1)的形状作为列拼接在一起,也就是垂直形状的张量拼接在一起
dstack
按照深度方向开始拼接张量序列,如果序列维度不足三维就转换为三维
hsatck
按照列垂直拼接张量序列
vsatck
按照行来水平张量拼接