我的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选取xory来 这两个张量只能是(浮点)(整型)(复数)
5.3 拼接
cat
连接的几个张量用张量组成的序列传入,这些张量必须在给出的dim上有一样的shape
column_stack
将输入的张量序列中的每一个都转为(numel,1)的形状作为列拼接在一起,也就是垂直形状的张量拼接在一起
dstack 按照深度方向开始拼接张量序列,如果序列维度不足三维就转换为三维
hsatck 按照列垂直拼接张量序列
vsatck 按照行来水平张量拼接
