dp=[[False]*n for _ in range(n)]
这样就生成了n*n的False矩阵
栈(先进后出)
使用 append() 方法存入数据;使用 pop() 方法读取数据。
队列(先进先出)
存入数据时使用 insert() 方法,设置其第一个参数为 0,即表示每次都从最前面插入数据;读取数据时,使用 pop() 方法
利用deque()建立 ,append()添加,popleft()实现队列提取,pop实现栈提取
1. queueAndStack = deque()
2. queueAndStack.append(1)
3. queueAndStack.append(2)
4. queueAndStack.append("hello")
5. print(list(queueAndStack))
7. #实现队列功能,从队列中取一个元素,根据先进先出原则,这里应输出 1
8. print(queueAndStack.popleft())
9. #实现栈功能,从栈里取一个元素,根据后进先出原则,这里应输出 hello
10. print(queueAndStack.pop())
11. #再次打印列表
12. print(list(queueAndStack))
通过pyyaml实现
pip install pyyaml
torch.utils.data.distributed.DistributedSampler
使用torch.utils.data.distributed.DistributedSampler
, 结果显示,数据被平分到两块卡上,每个epoch被分配到每块卡上的数据都一样。
avg_fn = lambda averaged_model_parameter, model_parameter, num_averaged: \
args.ema_rate * averaged_model_parameter + (1 - args.ema_rate) * model_parameter #定义了一个计算的方法
ema_model = optim.swa_utils.AveragedModel(model, avg_fn=avg_fn)#利用model和参数平均化得到ema_model
其中avg_fn是自己定义的参数变化,ema_model是参数变化之后得到的model
Leaky有助于扩大ReLU函数的范围
如果权重是通过线性层(卷积或全连接)隐性确定的,则需设置mode=fan_in。
import torch
linear_layer = torch.nn.Linear(node_in, node_out)
init.kaiming_normal_(linear.weight, mode=’fan_in’)
output_data = relu(linear_layer(input_data))
如果通过创建随机矩阵显式创建权重,则应进行设置mode=‘fan_out’。
import torch
w1 = torch.randn(node_in, node_out)
init.kaiming_normal_(w1, mode=’fan_out’)
b1 = torch.randn(node_out)
output_data = relu(linear(input_data, w1, b1))
在做实验的时候,服务器要是脑抽就会断线,这时候跑半天的代码功亏一篑,所以这里会尝试用日记记录下来每次运行的结果,这边拿top-1和top-5的结果来显示
logger.info(f'{args.dataset} error rate (%) | Top1 {100 - acc1/n_samples} | Top5 {100 - acc5/n_samples}')
PyTorch 之 Checkpoint 机制解析_Tom Hardy的博客-CSDN博客
该技术的核心是一种使用时间换空间的策略。在现有的许多方法中被大量使用,例如 DenseNet、Swin Transformer 源码中都可以看到它的身影。
开门见山的说,PyTorch 在进行深度学习训练的时候,有 4 大部分的显存开销,分别是模型参数(parameters),模型参数的梯度(gradients),优化器状态(optimizer states) 以及 中间激活值(intermediate activations) 或者叫中间结果(intermediate results)。
而通过 Checkpoint 技术,我们可以通过一种取巧的方式,使用 PyTorch 提供的 “no-grad” (no_grad()
)模式来避免将这部分运算被autograd记录到反向图“backward graph”中,从而避免了对于中间激活值的存储需求。
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭/线程中锁的自动获取和释放等。
with torch.no_grad() 在该模块下,所有计算得出的tensor的requires_grad都自动设置为False。
达到反向传播时禁用梯度计算以加快计算速度
nums 是数组的对象,而 nums[:] 是对指数组 nums 的元素
也就是说后者如果运行下方代码,元素的变换是可以实现的,而前者是不变
nums = [1,2,3,4,5] # 创建一个数组
res = []
res.append(nums[:])
nums[0], nums[4] = nums[4], nums[0] # 交换数组中的元素
res.append(nums[:])
print(res)
Python中通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。为了避免这种情况的发生,可以使用collections类中的defaultdict()方法来为字典提供默认值。
使用list作第一个参数,可以很容易将键-值对序列转换为列表字典。
以leetcode上的一道题为例子
from collections import defaultdict
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
mp = defaultdict(list)
for st in strs:
print(sorted(st))
key = "".join(sorted(st))
print(key)
mp[key].append(st)
print(st)
print(list(mp.values()))
defaultdict还可以被用来计数,将default_factory设为int即可
default_factory设为set时,可以用defaultdict建立集合字典(a dictionary of sets)(set使用add)
返回 input tensor 中所有元素的最大值。
torch.maximum()
torch.maximum(input, other) → Tensor
定义:从原tensor中获取指定dim和指定index的数据
cclasses = torch.gather(datas, 1, run_classes) #获取指定dim和指定index的数据 也就是获取类
res = torch.gather(cclasses, 2, run_indices)#获取指定dim和指定index的数据 也就是获取图像
def torch_cov(input_vec:torch.tensor):
x = input_vec- torch.mean(input_vec,axis=0)
cov_matrix = torch.matmul(x.T, x) / (x.shape[0]-1)
return cov_matrix
CUDA_VISIBLE_DEVICES=1python main.py --dataset-path
"/home/user/Linxx/matchingNets/miniImageNet/images"--dataset miniimagenet --model resnet12 --epochs 0 --manifold-mixup 500 --rotations --cosine --gamma 0.9 --milestones 100 --batch-size 64 --preprocessing ME --n-shots 1 --skip-epochs 450 --save-model "./models/resnet12_500_MSC.pt1" --save-model "./models/resnet_features_500_MSC.pt1"