python对ndarray全体除以⼀个数_Python学习教程_Python学
习路线:5。。。
谁说的程序员不配拥有爱情,谁说的,咋这真实呢
520我得给⼤家来点⼲货,说不定你们谁有看上我的呢!私撩(Python)哈!
这⾥晨晨给⼤家总结了⼀些PyTorch最常⽤的代码合集,认真看完哈!
Python学习教程_Python学习路线:520⼲货,超实⽤PyTorch常⽤代码段合集
本⽂代码基于 PyTorch 1.0 版本,需要⽤到以下包
import collectionsimport osimport shutilimport tqdmimport numpy as npimport PIL.Imageimport torchimport torchvision
基础配置
检查 PyTorch 版本
torch.__version__ # PyTorch versiontorch.version.cuda # Corresponding CUDA versiontorch.backends.cudnn.version() # Corresponding cuDNN versionto 更新 PyTorch
PyTorch 将被安装在 anaconda3/lib/python3.7/site-packages/torch/⽬录下。
conda update pytorch torchvision -c pytorch
固定随机种⼦
torch.manual_seed(0)torch.cuda.manual_seed_all(0)
指定程序运⾏在特定 GPU 卡上
在命令⾏指定环境变量
CUDA_VISIBLE_DEVICES=0,1 python train.py
或在代码中指定
判断是否有 CUDA ⽀持
torch.cuda.is_available()
设置为 cuDNN benchmark 模式
Benchmark 模式会提升计算速度,但是由于计算中有随机性,每次⽹络前馈结果略有差异。
torch.backends.cudnn.benchmark = True
如果想要避免这种结果波动,设置
torch.backends.cudnn.deterministic = True
清除 GPU 存储
有时 Control-C 中⽌运⾏后 GPU 存储没有及时释放,需要⼿动清空。在 PyTorch 内部可以
pty_cache()
或在命令⾏可以先使⽤ ps 到程序的 PID,再使⽤ kill 结束该进程
ps aux | grep pythonkill -9 [pid]
或者直接重置没有被清空的 GPU
nvidia-smi --gpu-reset -i [gpu_id]
张量处理
张量基本信息
数据类型转换
# Set default tensor type. Float in PyTorch is much faster h.set_default_tensor_type(torch.FloatTensor)# sor = tenso torch.Tensor 与 np.ndarray 转换
# torch.Tensor -> np.ndarray.ndarray = tensor.cpu().numpy()# np.ndarray -> sor = torch.from_numpy(ndarray).float()tensor = torch.from_ torch.Tensor 与 PIL.Image 转换
PyTorch 中的张量默认采⽤ N×D×H×W 的顺序,并且数据范围在 [0, 1],需要进⾏转置和规范化。
# torch.Tensor -> PIL.Image.image = PIL.Image.fromarray(torch.clamp(tensor * 255, min=0, max=255 ).byte().permute(1, 2, 0).cpu().numpy())image = tor np.ndarray 与 PIL.Image 转换
# np.ndarray -> PIL.Image.image = PIL.Image.fromarray(ndarray.astypde(np.uint8))# PIL.Image -> np.ndarray.ndarray = np.asarray(PIL.Image.open(path 从只包含⼀个元素的张量中提取值
这在训练时统计 loss 的变化过程中特别有⽤。否则这将累积计算图,使 GPU 存储占⽤量越来越⼤。resized
value = tensor.item()
张量形变
张量形变常常需要⽤于将卷积层特征输⼊全连接层的情形。相⽐ torch.view,shape 可以⾃动处理输⼊张量不连续的情况。
tensor = shape(tensor, shape)
打乱顺序
tensor = tensor[torch.randperm(tensor.size(0))] # Shuffle the first dimension
⽔平翻转
PyTorch 不⽀持 tensor[::-1] 这样的负步长操作,⽔平翻转可以⽤张量索引实现。
# Assume tensor has shape N*D*sor = tensor[:, :, :, torch.arange(tensor.size(3) - 1, -1, -1).long()]
复制张量
有三种复制的⽅式,对应不同的需求。
# Operation | New/Shared memory | Still in computation graph |tensor.clone() # | New | Yes |tensor.detach() # | Shared | No |tensor.detach.clone()() # | Ne 拼接张量
注意 torch.cat 和 torch.stack 的区别在于 torch.cat 沿着给定的维度拼接,⽽ torch.stack 会新增⼀维。例如当参数是 3 个 10×5 的张量,torch.cat 的结果是 30×5 的张量,⽽ torch.stack 的结果是 3×10×5 的张量。
tensor = torch.cat(list_of_tensors, dim=0)tensor = torch.stack(list_of_tensors, dim=0)
将整数标记转换成独热(one-hot)编码
PyTorch 中的标记默认从 0 开始。
N = tensor.size(0)one_hot = s(N, num_classes).long()one_hot.scatter_(dim=1, index=torch.unsqueeze(tensor, dim=1), s(N, num_c 得到⾮零/零元素
# Expand tensor of shape 64*512 to shape 64*512*h.reshape(tensor, (64, 512, 1, 1)).expand(64, 512, 7, 7)
矩阵乘法
# Matrix multiplication: (m*n) * (n*p) -> (m*p).result = (tensor1, tensor2)# Batch matrix multiplication: (b*m*n) * (b*n*p) -> (b*m*p).result = torch.bm 计算两组数据之间的两两欧式距离
# X1 is of shape m*d.X1 = torch.unsqueeze(X1, dim=1).expand(m, n, d)# X2 is of shape n*d.X2 = torch.unsqueeze(X2, dim=0).expand(m, n, d)# dist is of s 模型定义
卷积层
最常⽤的卷积层配置是
conv = Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=True)conv = Conv2d(in_channels, out_channels, k 如果卷积层配置⽐较复杂,不⽅便计算输出⼤⼩时,可以利⽤如下可视化⼯具辅助
0GAP(Global average pooling)层
gap = AdaptiveAvgPool2d(output_size=1)
双线性汇合(bilinear pooling)
X = shape(N, D, H * W) # Assume X has shape N*D*H*WX = torch.bmm(X, anspose(X, 1, 2)) / (H * W) # Bilinear poolingassert X.size() == (N 多卡同步 BN(Batch normalization)
当使⽤ DataParallel 将代码运⾏在多张 GPU 卡上时,PyTorch 的 BN 层默认操作是各卡上数据独⽴地计算均值和标准差,同步BN 使⽤所有卡上的数据⼀起计算 BN 层的均值和标准差,缓解了当批量⼤⼩(batch size)⽐较⼩时对均值和标准差估计不准的情况,是在
⽬标检测等任务中⼀个有效的提升性能的技巧。
类似 BN 滑动平均
如果要实现类似 BN 滑动平均的操作,在 forward 函数中要使⽤原地(inplace)操作给滑动平均赋值。
class Module) def __init__(self): ... ister_buffer('running_mean', s(num_features)) def forward(self, X): ... self.running_mean 计算模型整体参数量
num_parameters = sum(torch.numel(parameter) for parameter in model.parameters())
类似 Keras 的 model.summary() 输出模型信息
模型权值初始化
注意dules() 和model.children() 的区别:dules() 会迭代地遍历模型的所有⼦层,⽽ model.children() 只会遍历模
型下的⼀层。
# Common practise for initialization.for layer dules(): if isinstance(layer, Conv2d): init.kaiming_normal_(layer.weight, mode='部分层使⽤预训练模型
注意如果保存的模型是 DataParallel,则当前的模型也需要是
model.load_state_dict(torch.load('model,pth'), strict=False)
将在 GPU 保存的模型加载到 CPU
model.load_state_dict(torch.load('model,pth', map_location='cpu'))
数据准备、特征提取与微调
得到视频数据基本信息
import cv2video = cv2.VideoCapture(mp4_path)height = (cv2.CAP_PROP_FRAME_HEIGHT))width = (cv2.CAP_PROP_FRAME_W TSN 每段(segment)采样⼀帧视频
K = self._num_segmentsif is_train: if num_frames > K: # Random index for each segment. frame_indices = torch.randint( high=num_frames // K, size=(K,)提取 ImageNet 预训练模型某层的卷积特征
# VGG-16 del = dels.vgg16(pretrained=True).features[:-1]# VGG-16 del = dels.vgg16(pre 提取 ImageNet 预训练模型多层的卷积特征
class Module): """Helper class to extract several convolution features from the given pre-trained model. Attributes: _model, torch 其他预训练模型
微调全连接层
model = snet18(pretrained=True)for param in model.parameters(): quires_grad = Falsemodel.fc = nn.Linear(512, 100) # Re 以较⼤学习率微调全连接层,较⼩学习率微调卷积层
model = snet18(pretrained=True)finetuned_parameters = list(map(id, model.fc.parameters()))conv_parameters = (p for p in model.pa 模型训练
常⽤训练和验证数据预处理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论