pytorch学习笔记

文章目录

  • 一、python
  • 二、numpy
    • numpy如何初始化数组
      • numpy二维插值
  • 三、其他
      • 1. OpenCV
      • 2. visdom
      • 3. torchvision中的可视化
      • 4. LATEX
  • 四、pytorch
    • 张量的创建
    • 张量类型转化
    • Pytorch中Tensor与各种图像格式的相互转化
    • PyTorch里面的torch.nn.Parameter()
    • pytorch中的参数初始化方法总结
    • [torch中的几种乘法。torch.mm, torch.mul, torch.matmul](https://blog.csdn.net/weixin_42105432/article/details/100691592)
    • torch.nonzero()
    • [python 判断矩阵中每行非零个数的方法](https://www.jb51.net/article/155373.htm)
    • 加减乘除
    • 广播机制
    • torch和numpy互相转换
    • 取最大值、比大小、排序
    • pytorch采样
    • 对维度进行操作时比较重要的几个方法
      • - repeat,expand
      • - reshape, view, permute
    • 操作索引
      • - torch.linspace()
      • [- torch.arange()](https://vimsky.com/examples/usage/python-pytorch-arange-method.html)
      • - [pytorch使用tensor作为tensor的索引](https://blog.csdn.net/chenf1999/article/details/108552376)
      • - x = x[0, :, ;]
    • nn.Module, nn.ModuleList, nn.Sequential
    • 一些小trick
    • pytorch里如何使用logger保存训练参数日志?
    • 反卷积
    • flops和param的计算
    • 如何取出model的结构与参数
    • fold和unfold
    • dataloader

一、python

  • Python也有自己的三目运算符:   
     条件为真时的结果 if 判段的条件 else 条件为假时的结果

  • .A 将矩阵转化为数组

  • 报错:'local variable 'dataset' referenced before assignment'
    解决方案:dataset = None

  • 转义字符
    https://blog.csdn.net/sj349781478/article/details/78363740

  • split方法
    stringname.split(string, int)前者string指的是遇到哪个字符进行分割,int指的是整个string分割几次。返回一个list。从前往后开始分。stringname.rsplit(string, int)则是从后往前分。

  • python去掉了long数据类型。数据类型之间的转换用int(),str(), float()
    numpy数据类型转换:numpy.astype(‘int32’), numpy.astype(‘float’)
    numpy和tensor互相转化:tensor.from_numpy(numpy)

  • 复制文件
    copyfile(source_path, target_path)

  • 获取某个文件夹中所有文件名

file_dir = "F:/ant"
for root, dirs, files in os.walk(file_dir, topdown=False):
    print(root)     # 当前目录路径
    print(dirs)     # 当前目录下所有子目录
    print(files)        # 当前路径下所有非目录子文件
  • list合并方法:+,append,extend,切片
    注意,append是将两个list拼成一个[list, list]。而extend是将两个list拼成一个list。
    Python3中列表list合并的四种方法

  • 计数器Counter类:用于追踪值的出现次数

  • 统计列表中不同元素的数量:使用set

list=[1,1,2,2,3]
print(list)
set1=set(list)
print(set1)
print(len(set1))
得到结果:
[1, 1, 2, 2, 3]
{1, 2, 3}
3

二、numpy

numpy如何初始化数组

  1. Numpy简介
  2. 使用Numpy创建数组
  3. 创建空数组
    empty()函数
    empty_like()函数
  4. 创建填充固定值的数组
    zeros()函数
    zeros_like()函数
    ones()函数
    full()函数
  5. 生成随机数数组
    seed()函数
    RandomState()函数
    random()函数
    permutation()函数
    shuffle()函数
    rand()函数
    randint()函数
    randn()函数
    binomial()函数
    normal()函数
    beta()函数
    chisquare()函数
    gamma()函数
    uniform()函数
  6. 生成排序好的数组
    arange()函数
    linspace()函数
  7. 从已有对象中生成数组
    array()函数
    asarray()函数
    asanyarray()函数
    ascontiguousarray()函数
  8. 根据文件生成数组
  9. 相关内容
  10. NumPy数据类型
  • Python中numpy数组的拼接、合并
  • numpy 数据类型转换
    numpy中的数据类型转换,不能直接改原数据的dtype! 只能用函数.astype(int)。

numpy二维插值

https://www.cnblogs.com/xsxsz/p/11361721.html
***https://blog.csdn.net/weixin_44524040/article/details/95221757
https://blog.csdn.net/weixin_44524040/article/details/95221757

三、其他

1. OpenCV

  • 如何安装openCV
    pip install opencv-python但是外网线路导致下载过慢
    此时可以指定镜像pip install -i http://mirrors.aliyun.com/pypi/simple/ opencv-python
    但是可能提示不信任,此时使用
    pip install -i http://mirrors.aliyun.com/pypi/simple/ opencv-python --trusted-host mirrors.aliyun.com

  • pytorch的tensor,Image,numpy和opencv四种格式的相互转换

  • Pytorch:将图像tensor数据用Opencv显示

  • python opencv CV_8UC1与CV_32SC1类型相关错误
    因为自定义卷积的元素值没有进行归一化,图像像素超过255,而且变为浮点型。需要归一化。可以参考上面的链接,里面做了归一化。

  • opencv中伪彩色applyColorMap函数绘制热力图
    https://blog.csdn.net/kingkee/article/details/92785118
    借鉴CAM pytorch版本的写法:
    https://github.com/chaeyoung-lee/pytorch-CAM/blob/master/update.py
    https://blog.csdn.net/sinat_37532065/article/details/103362517

2. visdom

visdom简易教程
python -m visdom.server
https://www.cnblogs.com/fanghao/p/10256287.html
https://ptorch.com/news/77.html
https://www.cnblogs.com/wanghui-garcia/p/10658565.html

3. torchvision中的可视化

Pytorch save_image和make_grid函数详解
make_grid用于把几个图像按照网格排列的方式绘制出来,save_image用于保存图像。这两个函数的函数签名差不多,所以只说一个。
Pytorch torchvision.utils.make_grid()用法
PyTorch模型训练特征图可视化

  • plt.imshow()函数负责对图像进行处理,并显示其格式,而plt.show()则是将plt.imshow()处理后的函数显示出来。
plt.imshow(image)  #image表示待处理的图像
plt.show()

4. LATEX

  • 改变页面上字体的宽度,通过改变页边距
    https://jingyan.baidu.com/article/ab0b563092c6b7c15afa7db8.html
    在这里插入图片描述
  • 强制图片位置
\begin{figure}[htb]

  \centering

  % Requires \usepackage{graphicx}

  \includegraphics[width=9cm, height=6cm]{s.eps}\\

  \caption{(color online) 

}\label{straddltimeScale}

\end{figure}

[h] 表示的当前位置(here),也就是说图片排在你设置的当前位置,但是如果这一页的空间不足以放下这个图片,此时图片会转到下一页。
[t] 顶端(top)。此时系统会将图片放置在页面的顶部。
[b] 底部. (bottom) 这里是优先将图片放置在底部,也就是页面的底部。
[p] 这个是将图片设置为浮动状态,也就是可以根据系统排版的,自动放置图片的位置。
[htb] 优先放置在最佳位置,然后将其放在顶端最后放在底部。我们知道一般对于论文的输入可不是几个简单的文字和图片,可能还要有大量的公式,所以几个简单的命令一般会造成论文存在大量的空隙,所以我们一般将上面的命令结合着使用。

  • 空格
    pytorch学习笔记_第1张图片

  • %怎么打?使用$\%$,或直接输入\%,使用空格隔开

四、pytorch

pytorch: Tensor 常用操作
这个写的很全!!赞!

pytorch入门教程(五):Tensor统计信息操作

  1. 范数
  2. 最大,最小,均值,乘积值,元素所在位置
  3. 前K个最大、最小值所在位置
  4. 判断大小,返回1(正确),0(错误)
  5. equl()
  6. where 按条件选择需要的内容
  7. gather 索引所需内容

张量的创建

Pytorch学习之旅(0)——张量的简介及创建

张量类型转化

Pytorch中Tensor与各种图像格式的相互转化

PyTorch里面的torch.nn.Parameter()

pytorch中的参数初始化方法总结

torch中的几种乘法。torch.mm, torch.mul, torch.matmul

一、点乘
点乘都是broadcast的,可以用torch.mul(a, b)实现,也可以直接用*实现。
二、矩阵乘
矩阵相乘有torch.mm和torch.matmul两个函数。其中前一个是针对二维矩阵,后一个是高维。当torch.mm用于大于二维时将报错。

torch.nonzero()

Pytorch:torch.nonzero()函数
得到非0元素的索引。有两种返回方法,一种是返回张量,输出的每一行为非零元素的索引(坐标),另一种是返回tuple,则返回的是将坐标拆开,如原数据有4维,则返回4个张量,每个张量中是对应维度的非0索引。

比如,二维数组x,方法1返回:idx = [[0, 0], [0, 1], [1, 2]],则方法2返回idx = [tensor[0,0,1], tensor[0,1, 2]]. 用第二个方法的好处是,可以将其作为索引取出原数据x的值。比如,我想得到x的非零数据,只需x[idx[0], idx[1]]即可。

torch.nonzero的理解

python 判断矩阵中每行非零个数的方法

方法4比较有启发性:

exist = (data > 0) * 1.0
factor = np.ones(data.shape[1])
res = np.dot(exist, factor)

新建一个全为1的矩阵,与原矩阵(全为0和1)相乘,那么就直接得到了原矩阵每一行的非零数个数。

加减乘除

numpy按元素相乘: np.multiply(a,b)
torch按元素相乘:torch.mul(a, b)
pytorch基本运算:加减乘除、对数幂次等

  1. 加减乘除(按元素)
    a + b = torch.add(a, b)
    a - b = torch.sub(a, b)
    a * b = torch.mul(a, b)
    a / b = torch.div(a, b)

  2. 矩阵相乘
    torch.mm(a, b) # 此方法只适用于2维
    torch.matmul(a, b)
    a @ b = torch.matmul(a, b) # 推荐使用此方法
    用处:
    降维:比如,[4, 784] @ [784, 512] = [4, 512]
    大于2d的数据相乘:最后2个维度的数据相乘:[4, 3, 28, 64] @ [4, 3, 64, 32] = [4, 3, 28, 32]
    前提是:除了最后两个维度满足相乘条件以外,其他维度要满足广播条件,比如此处的前面两个维度只能是[4, 3]和[4, 1]

广播机制

torch和numpy互相转换

PyTorch 的官方介绍是一个拥有强力GPU加速的张量和动态构建网络的库,其主要构件是张量,所以我们可以把 PyTorch 当做 NumPy 来用,PyTorch 的很多操作好 NumPy 都是类似的,但是因为其能够在 GPU 上运行,所以有着比 NumPy 快很多倍的速度。

看一下两者之间的转换:

import torch
import numpy as np
# 创建一个 numpy ndarray
numpy_tensor = np.random.randn(10, 20)
#我们可以使用下面两种方式将numpy的ndarray转换到tensor上
pytorch_tensor1 = torch.Tensor(numpy_tensor)
pytorch_tensor2 = torch.from_numpy(numpy_tensor)
 
 
#同时我们也可以使用下面的方法将 pytorch tensor 转换为 numpy ndarray
# 如果 pytorch tensor 在 cpu 上
numpy_array = pytorch_tensor1.numpy()
# 如果 pytorch tensor 在 gpu 上
numpy_array = pytorch_tensor1.cpu().numpy()

pytorch 中tensor在CPU和GPU之间转换,以及numpy之间的转换
注意将numpy转换为tensor后,可能device属性仍然是cpu,此时需要.cuda() normpdf = torch.Tensor(normpdf).cuda()

  1. CPU tensor转GPU tensor:
    cpu_imgs.cuda()

  2. GPU tensor 转CPU tensor:
    gpu_imgs.cpu()

  3. numpy转为CPU tensor:
    torch.from_numpy( imgs )

  4. CPU tensor转为numpy数据:
    cpu_imgs.numpy()

  5. note:GPU tensor不能直接转为numpy数组,必须先转到CPU tensor。

  6. 如果tensor是标量的话,可以直接使用 item() 函数(只能是标量)将值取出来:
    print loss_output.item()

取最大值、比大小、排序

  • PyTorch max()函数取最大值
    注意,只有torch.max(input, dim)input.max(dim)时,即指定维度时,才会生成两个东西,第一个是最大值,第二个是index。不指定维度则只生成最大值。
  • pytorch逐元素比较tensor大小实例—gt()函数
  • Pytorch 中使用 sort() 进行排序的基本方法
  • PyTorch - 在torch.sort之后获得原始张量顺序的更好方法
    有时需要在排序后将张量复原,可以采取这种方式。
    此外这篇博客中取index并使用该index进行索引的方法值得学习。重点在于torch.linspace()函数与加法操作,将原始的排序后的index与一个等差数列对应相加,就会从[0,1,2], [2, 1, 0]变为[0,1,2],[5,4,3]。
  • torch.equal(a, b)比较是否相等
  • 获取张量中的值,tensora.item()

pytorch采样

  • Sampler类与4种采样方式
    由于我们不能将大量数据一次性放入网络中进行训练,所以需要分批进行数据读取。这一过程涉及到如何从数据集中读取数据的问题,pytorch提供了Sampler基类【1】与多个子类实现不同方式的数据采样。子类包含:
    Sequential Sampler(顺序采样)
    Random Sampler(随机采样)
    Subset Random Sampler(子集随机采样)
    Weighted Random Sampler(加权随机采样)等等。

对维度进行操作时比较重要的几个方法

- repeat,expand

PyTorch学习笔记——repeat()和expand()区别

- reshape, view, permute

操作索引

- torch.linspace()

PyTorch中torch.linspace的详细用法
该方法可以实现将原始的排序后的index与一个等差数列对应相加,就会从[0,1,2], [2, 1, 0]变为[0,1,2],[5,4,3]。

- torch.arange()

用法同上,用于实现index等差数列来操作tensor的索引

- pytorch使用tensor作为tensor的索引

- x = x[0, :, ;]

X[:,0]
# 二维数组取第1维所有数据

X[:,1]
# 第2列

X[0,:]
# 第1行

X[3,:]
# 第三行

X[1:4,:]
# 第一二三行

index = [2, 3]
x = x[index, :]
# 将第一个维度的数据拆成index的维度。即变为x[2,3,:](最后一个维度不变)

nn.Module, nn.ModuleList, nn.Sequential

https://zhuanlan.zhihu.com/p/64990232

nn.Module, nn.ModuleList, nn.Sequential,这些类我们称之为容器 (containers),因为我们可以添加模块 (module) 到它们之中。

你可以把任意 nn.Module 的子类 (比如 nn.Conv2d, nn.Linear 之类的) 加到这个 list 里面,方法和 Python 自带的 list 一样,无非是 extend,append 等操作。但不同于一般的 list,加入到 nn.ModuleList 里面的 module 是会自动注册到整个网络上的,同时 module 的 parameters 也会自动添加到整个网络中。

为了简单,我需要使用for循环构建3个几乎一模一样的网络,一开始我写的是:

self.mergeAtt = [
	   nn.Sequential(
	       nn.Conv2d(in_channels=256, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
	       nn.Conv2d(in_channels=128, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
	       nn.ReLU(),
	       nn.Conv2d(in_channels=128, out_channels=512, kernel_size=scale_w[i], stride=1, bias=False),# x0-->[64, 512, 1, 1]
	       nn.ReLU(),
	       # nn.Flatten(),  # x0-->[64, 512]
	       # nn.Linear(512, num_classes))  # x0-->[64, 10]
	       nn.Conv2d(in_channels=512, out_channels=num_classes*16, kernel_size=1, stride=1, bias=False)) # x0-->[64, 160]
	   for i in range(scale_num)]

但这样会报错:
Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same
这说明在python自带的列表中创建的网络是放在cpu上的,所以需要使用 nn.ModuleList,将它理解为pytorch版本的列表,专门用于放网络。

self.mergeAtt = nn.ModuleList([
    nn.Sequential(
        nn.Conv2d(in_channels=256, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
        nn.Conv2d(in_channels=128, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
        nn.ReLU(),
        nn.Conv2d(in_channels=128, out_channels=512, kernel_size=scale_w[i], stride=1, bias=False),# x0-->[64, 512, 1, 1]
        nn.ReLU(),
        # nn.Flatten(),  # x0-->[64, 512]
        # nn.Linear(512, num_classes))  # x0-->[64, 10]
        nn.Conv2d(in_channels=512, out_channels=num_classes*16, kernel_size=1, stride=1, bias=False)) # x0-->[64, 160]
    for i in range(scale_num)])

一些小trick

  • None相当于在数组中多加一个维度。@是矩阵相乘。*用来对tensor进行矩阵进行逐元素相乘。
    priors = x[None, :, :, None, :] @ self.route_weights[:, None, :, :, :]

  • release GPU cache: torch.cuda.empty_cache()

pytorch里如何使用logger保存训练参数日志?

https://www.zhihu.com/question/361602016

反卷积

https://blog.csdn.net/qq_27261889/article/details/86304061/
Height′ =Height+(Stride−1)∗(Height−1)

flops和param的计算

https://www.cnblogs.com/king-lps/p/10904552.html
flops和mac的关系

如何取出model的结构与参数

https://www.cnblogs.com/yqpy/p/12585331.html

  • model.parameters(),迭代打印model.parameters()将会打印每一次迭代元素的param而不会打印名字,这是他和named_parameters的区别,两者都可以用来改变requires_grad的属性
  • model.named_parameters(),迭代打印model.named_parameters()将会打印每一次迭代元素的名字和param

model.parameters()与model.state_dict()

fold和unfold

https://blog.csdn.net/loseinvain/article/details/88139435
https://blog.csdn.net/qq_33590958/article/details/111176223

dataloader

写的超好!
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系

其他:torch.utils.data.DataLoader()详解
PyTorch—torch.utils.data.DataLoader 数据加载类

我感觉这个参数没啥用。
Pytorch.utils.data.DataLoader中collate_fn参数的使用
torch.utils.data.dataloader参数collate_fn简析

想要改变获取数据的顺序,可以自定义sampler。
Sampler类与4种采样方式
Pytorch Sampler详解
比如,这次我要实现测试集一个比较与众不同的获取数据顺序,需要每拿一张图(按照原顺序拿),再从测试集中随机抽取五十张图和它放在一起作为一个batch。
于是,定义了一个继承自sampler类的采样器,修改了其__iter__方法。

torch.randperm():返回一个0到n-1的数组,数组中的数是0到n-1随机顺序排列,且不会出现重复。

你可能感兴趣的:(ML)