深度学习1
一、库的安装
1、cuda/cpu
cuda 有最好,没有无需额外安装;cpu无需其他操作,直接进入下面步骤
查看 nvidia 驱动版本:cmd里面,输入nvidia-smi 查看GPU驱动程序版本 CUDA Version位置(保证CUDA版本号<=GPU驱动程序版本 ):
2、torch
官网:Previous PyTorch Versions | PyTorch 选择版本距离最新低于两个层次的,比如目前最新为2.5.0,选择的时候挑2.2.2及一下版本,不可太低。
根据cuda、cpu、操作系统、虚拟环境 复制对应内容 ,例如:
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=12.1 -c pytorch -c nvidia
在对应虚拟环境中执行该语句安装(时间很长,不推荐)
推荐方法:
1、在复制官网安装命令后:打开阿里云镜像源: pytorch-wheels-cu121安装包下载_开源镜像站-阿里云 选择对应版本的文件下载(cu表示cuda ,cp表示python版本)
2、下载使用idm等工具加速;
3、打开虚拟环境切换路径到下载文件的地址(直接将文件放到命令语句文件地址最快),执行
conda install 文件完整名称
4、文件安装完成后,执行上面复制的官网命令语句,省掉最后内容,直接安装
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=12.1
5、检查包
conda list
若发现存在漏掉某个包,重新安装这个包即可(指定版本,不要更改)
安装torch过程会安装cuda,无需重复安装
二、Tensor概念
torch运算规程中将数据封装为tensor(张量)
tensor与 numpy
一致:数据的多维矩阵运算;都需要数据内容同一种格式(整数、浮点数);可以互相转化;可以切片、索引、布尔等操作
差异:numpy不能使用gpu加速计算,tensor可以指定gpu计算,且多线程并线计算;tensor可以自动求导;tensor支持更多的数据类型(同种大类型的不同子类)
1、数据基础
张量是一个多维数组,标量是0阶张量;向量是1阶张量;二维矩阵是2阶张量(通过方向等标签划分)。
1.1、浮点数类型
torch.float16
或 torch.half
:16位浮点数
torch.float32
或 torch.float
:32位浮点数(默认)
torch.float64
或 torch.double
:64位浮点数
1.2、整数类型
torch.int8
:8位整数
torch.int16
或 torch.short
:16位整数
torch.int32
或 torch.int
:32位整数(默认)
torch.int64
或 torch.long
:64位整数
1.3、布尔值
torch.bool
True/False
2、tensor创建
2.1、创建方式
数据创建和形状创建;指定形状时,默认填充随机数据,使用列表和数组创建时,自动获取数据和形状。
数据创建:tensor(小写t)
import torch
import numpy as np
# 使用标量创建张量
t1 = torch.tensor(7) # 创建0阶张量
print(t1,t1.shape)
# numpy 创建张量
data1 = np.array([10,20,30,40]) # 创建一阶张量
data2 = np.array([[10,20,30,40],[10,20,30,40]]) # 创建二阶张量
t1=torch.tensor(data1)
print(t1,t1.shape)
t2=torch.tensor(data2)
print(t2,t2.shape)
# 列表创建张量
data1 = [10,20,30] # 创建一阶张量
data2 = [[10,20,30],[10,20,30]] # 创建二阶张量
t1=torch.tensor(data1)
print(t1,t1.shape)
t2=torch.tensor(data2)
print(t2,t2.shape)
形状创建:Tensor(大写T)
import torch
import numpy as np
# 使用标量创建张量
t1 = torch.Tensor(7) # 创建1阶张量
t2 = torch.Tensor(2,3) # 创建2阶张量
print(t1,t1.shape)
print(t2,t2.shape)
2.2、创建线性数据张量
arange、linspace (与numpy操作一致,等差数列)
logspace(start,stop,num,base=10) :与linspace类似,等比数列,默认10为底的幂计算。
import torch
# 创建数列的张量,等差、等比
x =torch.arange(0,10) # 等差数列
print(x)
y = torch.linspace(0,10,11) # 等差数列
print(y)
z = torch.logspace(1,10,3, base=2) # 等比数列
print(z)
2.3、创建随机张量
manual_seed(num) 随机种子 ,数据随机,可重复
initial_seed 获取随机种子
rand(2,3) 创建形状为(2,3)的2阶张量、randn(2,3) 创建形状为(2,3)的标准正态分布数据、normal(1,1,(2,3)) 创建均值为1,标准差为1,形状为(2,3) 的正态分布数据。
import torch
# 随机数创建张量
torch.manual_seed(666) # 随机种子
print(torch.initial_seed)
t = torch.rand(2,3) # 随机生成张量
print(t)
t1 = torch.randn(2,3) # 标准正态分布的张量
print(t1)
t2 = torch.normal(1,1,(2,3)) # 标准正态分布的张量
print(t2)
2.4、创建01张量、指定值张量、单位矩阵张量
01张量:与numpy一致,zeros和ones,增加zeros_like和ones_like,表示复制形状使用01填充内部数据。
指定值张量:full((2,3),2) 创建形状为(2,3),数据全是2的张量;full_like(tensor,2),复制tensor的形状并用2填充数据创建张量
单位矩阵张量:eye(1) ,一个参数表示n*n矩阵,两个表示n*m矩阵
import torch
# 0数列的张量
x = torch.zeros(4,4)
print(x)
data = torch.tensor([10,20,30])
x2 = torch.zeros_like(data) # 复制data的形状,元素为0,不能是列表或数组
print(x2)
# 1数列的张量
y = torch.ones(4,4)
print(y)
data = torch.tensor([10,20,30])
y2 = torch.ones_like(data) # 复制data的形状,元素为1,不能是列表或数组
print(y2)
# 指定数填充张量
x = torch.full((3,2),666) # 指定形状和值
print(x)
y = torch.full_like(x,2) # 复制x的形状
print(y)
# 创建单元格张量
x1 = torch.eye(2) # 创建 2*2矩阵张量
x2 = torch.eye(2,3) # 创建 2*3矩阵张量
print(x1,'\n',x2)
3、tensor属性
dtype和device
dtype:数据内容的类型--第一点的数据基础
转化:创建时指定dtype = torch.int16
tensor对象.type(torch.float等)
tensor对象.half()、double()、long()等
import torch
# 类型转化
# 创建时指定
x = torch.tensor([10,20,30,40], dtype= torch.int8)
print(x.dtype)
# 使用type转化
x1 = x.type(torch.float16)
x2 = x.type(torch.int16)
print(x1.dtype,x2.dtype)
# 直接第哦啊用类型转化
print(x.half().dtype,x.double().dtype,x.float().dtype) # 直接转化等同于 torch.类型(x)
print(x.short().dtype,x.int().dtype,x.long().dtype)#int8需要使用torch.dtype才行,不存在 x.int8()
device :表示运行设备
torch.cuda.is_available() 表示是否连接到cuda,第一部分安装出现版本差异也就造成无法连接cuda。
转化:创建时指定 device = 'cpu\cuda'
tensor.to('cpu\cuda')
tensor.cuda()
import torch
# 获取当前设备是否有cuda
res=torch.cuda.is_available()
print(res)
# 设备切换
x = torch.tensor([10,20,30], device='cuda')
print(x.device)
y = torch.tensor([10,20,30])
# 多个cuda需要指定序号,默认0
y1 = y.to("cuda") # 返回新的tensor对象
print(y1.device)
y2 = y.to('cuda:0' if res else 'cpu')
print(y2.device)
y3 = y.cuda()
print(y3.device)
y4 = y.cuda() if torch.cuda.is_available() else y
print(y4.device)
三、数据转化
1、numpy 与 tensor 的转化
tensor->numpy:tesnor对象.numpy() 浅拷贝,共用内存地址
tensor对象.numpy().copy() 深拷贝
numpy -> tensor:from_numpy(数组) 浅拷贝
tensor(数组) 深拷贝
# 将 tensor 转化成 numpy
# 浅拷贝,共用一个内存地址
import torch
import numpy as np
x = torch.tensor([1,2,3])
print(x)
x_np = x.numpy()
print(x_np)
x_np[0] = 100 # 两个数据的第一个元素都变为100
print(x,x_np)
x[0] = 1000 # 两个数据的第一个元素都变为1000
print(x,x_np)
# copy()深拷贝,不共用一个内存地址
x = torch.tensor([1,2,3])
x_np = x.numpy().copy()
print(type(x), type(x_np))
x_np[0] = 100 # 只有数组的第一个元素变成了一百
print(x,x_np)
x[0] = 1000 # 只有张量的第一个元素变成了一千
print(x,x_np)
# 将 numpy 转化成 tensor
# from_numpy 内存共享
x = np.array([1,2,3])
x_t = torch.from_numpy(x)
x[0] = 100
x_t[1] = 200
print(x)
print(x_t)
# tensor 内存不共享
x = np.array([1,2,3])
x_t = torch.tensor(x)
x[0] = 100
x_t[1] = 200
print(x)
print(x_t)
2、图像与tensor转化
from torchvision import transforms
from PIL import Image
import cv2
import torch
步骤:1、使用 cv2.imread() 或 Image.open() 打开图片
2、使用transfroms.ToTensor() 创建转化器对象
3、使用转化器对象转化图片数据,得到tensor
import torch
from torchvision import transforms
import cv2
from PIL import Image
import numpy as np
# 转化到tensor
path =r"./data/animal/cat/0b54dde5f5.jpg"
img1 = cv2.imread(path) # 使用cv2 读取图片
img2 = Image.open(path) # 使用 Image 读取图片
print(img1.shape,np.array(img2).shape)
transfer = transforms.ToTensor()
img1_t = transfer(img1)
img2_t = transfer(img2)
print(img1_t.shape, img2_t.shape)
# tensor转化到 图像
transfer = transforms.ToPILImage()
img_h1 = transfer(img1_t)
img_h2 = transfer(img2_t)
img_h1.show(img_h1)
img_h2.show(img_h2)