本文介绍了一种重要的权重归一化技术,并且很早就被包含在 PyTorch 中,如下:
from torch.nn.utils import weight_norm
weight_norm(nn.Conv2d(in_channles, out_channels))
Run Code Online (Sandbox Code Playgroud)
从我了解到的文档weight_norm
中,每次传递之前都会重新参数化forward()
。但我不确定当所有内容都在内部运行with torch.no_grad()
并且模型设置为eval()
模式时,这种重新参数化是否也会在推理过程中发生。
有人可以帮我知道是否weight_norm
仅在训练期间或在上述推理模式期间有效吗?
谢谢
我有一个environment.yml文件,我在本地系统上使用它,如下所示,
conda env create -f environment.yml
Run Code Online (Sandbox Code Playgroud)
但我现在已经转向 Google Colab 并使用此链接将 Conda 安装到其中。
现在,我如何像以前在本地系统上那样使用 .yml 文件在 Colab 内创建新的 conda 环境?
我img
在 PyTorch 中有一个大小的张量bx2xhxw
,想使用 对其进行上采样torch.nn.functional.interpolate
。但是,在插值时,我不希望通道 1 使用通道 2 中的信息。为此,我应该这样做,
img2 = torch.rand(b,2,2*h,2*w) # create a random torch tensor.
img2[:,0,:,:] = nn.functional.interpolate(img[:,0,:,:], [2*h,2*w], mode='bilinear', align_corners=True)
img2[:,1,:,:] = nn.functional.interpolate(img[:,1,:,:], [2*h,2*w], mode='bilinear', align_corners=True)
img=img2
Run Code Online (Sandbox Code Playgroud)
或者简单地使用
img = nn.functional.interpolate(img, [2*h,2*w], mode='bilinear', align_corners=True)
Run Code Online (Sandbox Code Playgroud)
将解决我的目的。
我对在 NumPy 中创建 2D hanning、hamming、Blackman 等窗口感兴趣。我知道 NumPy 中存在一维版本的现成函数,例如np.blackman(51)
、np.hamming(51)
、np.kaiser(51)
、np.hanning(51)
等。
如何创建它们的 2D 版本?我不确定以下解决方案是否是正确的方法。
window1d = np.blackman(51)
window2d = np.sqrt(np.outer(window1d,window1d))
Run Code Online (Sandbox Code Playgroud)
- -编辑
令人担忧的是,np.sqrt
只期望正值,而np.outer(window1d,window1d)
肯定会有一些负值。一种解决方案是放弃np.sqrt
有什么建议如何将这些 1d 函数扩展到 2d 吗?
以下是 Pytorch 中随机权重平均的一个小工作代码,取自此处。
loader, optimizer, model, loss_fn = ...
swa_model = torch.optim.swa_utils.AveragedModel(model)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=300)
swa_start = 160
swa_scheduler = SWALR(optimizer, swa_lr=0.05)
for epoch in range(300):
for input, target in loader:
optimizer.zero_grad()
loss_fn(model(input), target).backward()
optimizer.step()
if epoch > swa_start:
swa_model.update_parameters(model)
swa_scheduler.step()
else:
scheduler.step()
# Update bn statistics for the swa_model at the end
torch.optim.swa_utils.update_bn(loader, swa_model)
# Use swa_model to make predictions on test data
preds = swa_model(test_input)
Run Code Online (Sandbox Code Playgroud)
在此代码中,第 160 个纪元之后,swa_scheduler
使用 代替通常的scheduler
。意味着什么swa_lr
?文件 …
我已经阅读了几个使用nn.init.kaiming_normal_()
PyTorch进行层初始化的代码。某些代码使用fan in
默认模式。在众多示例中,可以在此处找到一个示例并显示如下。
init.kaiming_normal(m.weight.data, a=0, mode='fan_in')
Run Code Online (Sandbox Code Playgroud)
但是,有时我会看到人们使用此处和下图所示的fan out
模式。
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
Run Code Online (Sandbox Code Playgroud)
有人可以给我一些指导方针或提示来帮助我决定选择哪种模式吗?此外,我正在使用 PyTorch 进行图像超分辨率和去噪任务,哪种模式更有益。
我一直在看到使用 Adam 优化器的代码。他们降低学习率的方式如下:
optimizer = torch.optim.Adam(net.parameters(),lr=0.01)
(training...
optimizer.step()...)
if iteration >= some_threshold:
for param_group in optimizer.param_groups:
param_group['lr'] = 0.001
Run Code Online (Sandbox Code Playgroud)
我认为所有参数的学习率都相同。那么为什么要迭代 param_groups 并为每个参数单独设置学习率呢?
下面的方法不是更快并且具有相同的效果吗?
optimizer = torch.optim.Adam(net.parameters(),lr=0.01)
scheduler = MultiStepLR(optimizer, milestones=[some_threshold], gamma=0.1)
(training...
optimizer.step()
scheduler.step())
Run Code Online (Sandbox Code Playgroud)
谢谢
我不太确定如何在 PyTorch 中测量 CPU 上深度模型的执行时间,仅用于推理。我在这里列出了其中一些,但它们可能不准确。如果需要,请更正它们,并在需要时提及更多。我在 PyTorch 版本 1.3.1 和 Intel Xeon 上运行,具有 64GB RAM、3.5GHz 处理器和 8 个内核。
我们应该使用time.time()
?
with torch.no_grad():
wTime = 0
start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)
out = model(input) # JUST FOR WARMUP
start.record()
for i in range(200):
input = torch.rand(1,1,2048,2048).to(device)
# beg = time.time() DO NOT USE FOR GPU
got = net_amplifier(low,for_amplifier)
# wTime+=time.time()-beg DO NOT USE FOR GPU
end.record()
torch.cuda.synchronize()
print('execution time in MILLISECONDS: {}'.format(start.elapsed_time(end)/200))
Run Code Online (Sandbox Code Playgroud)
对于此代码执行是在 GPU 上完成的。如果我必须在 …