我的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精度默认是4

  • threshold超出设置的阈值就省略显示,默认是100

  • edgeitems省略显示的时候每个维度首尾显示几位,默认是3位

  • linewidth 一行数据的字符数量超出linewidth的时候就换行显示

  • profile默认是pprint 简短显示short 全部显示full

  • sci_mode 是否启用科学计数法显示 默认None是让框架自己推断
    True是一直开启 False是一直关闭

set_flush_denormal 不知道干哈的 set_default_dtype设置默认的浮点类型(使用推测,也就是不指定dtype的时候有效)
简单来说就是替换float32(单精度浮点型) get_fault_dtype获取当前默认的浮点类型 set_default_tensor_type对Tensor()方法生成的浮点数类型进行设置,也就是替换原始FloatTensor方法 五、连接 维度变换 切片

5.1 分割

对张量的分割不是选取张量的一部分,而是将张量切成多个不同的张量 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 按照行来水平张量拼接

  • stack序列中的张量形状必须完全一样,按照指定维度年连接张量序列
  • tile对输入的张量在指定维度上重复几次 5.4 维度变换
    movedim 这个可以交换两个或者多个轴(维度) reshape 这个和交换维度不太一样,在维持元素数量不变的时候改变这个张量的形状, 这个比view靠谱些 squeeze移除所有为1的维度 transpose交换两个轴 t对二维张量做转置,也就是交换0,1维度