Pytorch 的编程技巧

系列文章目录


文章目录


一、模型的保存与加载

  • torch.saves(state, dir) 保存/序列化(保存图当前的状态)
  • torch.load(dir) 加载模型
    并行化,一般是 CPU 进行数据处理才会用到
  • torch.get_num_threads(): 获得用于并行化的 CPU 操作的OpenMP 线程数。
  • torch.set_num_threads(int) : 设定用于 CPU 并行操作的OpenMP线程数。

OpenMP:跨平台共享内存并行编程的API,旨在通过简单的注释将代码并行化,充分使用多核处理器,无需管理线程。

##Tensor on GPU

数据计算可以使用 GPU 和 CPU,我们可以使用 to 来进行两者之间的切换。一般我而言,我们经常使用 CPU 进行数据处理,使用 GPU 进行模型训练。

伪代码:

python 复制代码
if torch.cuda.is_available():
    device = torch.device('cuda')  # GPU
    y = torch.ones_like(x,device=device)
    x = x.to(device) # 等价于 .to("cuda")
    z = x+y
    print(x)
    print(z.to("cpu",torch.double)) # to 还可以更改数据类型

Tensor 的相关配置

  • torch.is_tensor() # 是 pytorch 中的Tensor类型,返回 true
  • torch.is_storage() # storage 类型返回 true
  • torch.set_flush_denormal(model) # 防止一些不正常的元素出现
  • torch.set_default_dtype(d) # 对torch.tensor()设置默认的类型
  • torch.printoptions(precision = None, threshold = None,edgeitems = None, linewidth = None,profile = None) # 打印参数的设置

pytorch 与 numpy 相互转化

  • torch.from_numpy(ndarry)
  • a.numpy()
python 复制代码
import numpy
import torch
import numpy as np

a = numpy.zeros([2,2])
print("a 的内容:",a)
b = torch.from_numpy(a)
print("b 的内容:",b)

这串代码使用numpy创建了一个张量,然后使用 torch.from_numpy(a) 转化成 torch 中的tensor张量。实际上,numpy 的操作与 torch 很相似,torch 很多功能都是向着 numpy 靠。我们可以使用OpenCV来读取一张图片,然后将它转化成一个张量,进行处理。读取的数据就是 numpy 格式的数据。

二、实例:读取一张图片

python 复制代码
import numpy
import torch
import cv2



img = cv2.imread("0197.jpg")
# 创建可调整大小的窗口
cv2.namedWindow("Resizable Window", cv2.WINDOW_NORMAL)  # 控制打印的大小
cv2.imshow("Resizable Window", img)      # 控制打印窗口大小

img_data = torch.from_numpy(img)
print(img)
print(img_data)

# 进行图片的反转
out = torch.flip(img_data,dims=[0])
out = out.numpy()                   # 一定要转化成numpy 才可以绘图
cv2.namedWindow("Resizable Window1", cv2.WINDOW_NORMAL)  # 控制打印的大小
cv2.imshow("Resizable Window1", out)      # 控制打印窗口大小
cv2.waitKey(0)

这里需要我们添加一个模块:

pip install opencv-python

通过cv2读入数据,此时的数据类型是 numpy 类型,可以通过这两句代码展示出来,一般窗口很大,这两串代码可以控制窗口大小,双引号是自由命名,后面的 out 是图片数据。

cv2.namedWindow("Resizable Window1", cv2.WINDOW_NORMAL) # 控制打印的大小
cv2.imshow("Resizable Window1", out) # 控制打印窗口大小

图片 1 展示了numpy 格式的数据类型,至于转化后的 tensor就省略了。tensor数据并不能直接绘图,所以要使用 .numpy() 转化成numpy数据才能绘图。在此之前,我们使用torch.flip(数据,纬度数组) 进行数据反转处理,输出的结果如 图 2 所示。
图 1 numpy 格式 图 2 图片旋转对比

最后的鸣谢,暑假将至,我在我弟(以工作)这边度过了一段独属于我的成长时光。成年人也会添麻烦,我给他带来了不少麻烦,在这里,如果我的文章对大家有帮助,请大家帮我进一下我弟弟创业的小铺,买不买都无所谓,感谢大家阅读鄙人的文章和进入小店祝大家生活愉快。