我正在寻求通过奇异值分解来反向传播渐变以用于正则化目的.PyTorch目前不支持通过奇异值分解进行反向传播.
我知道我可以编写自己的自定义函数来操作变量; 获取其.data张量,将torch.svd应用于它,将变量包围在其奇异值周围并在前向传递中返回,并在向后传递中将适当的雅可比矩阵应用于传入渐变.
但是,我想知道是否有一个更优雅(并且可能更快)的解决方案,我可以覆盖"类型变量没有实现无状态方法svd"错误直接,调用Lapack等?
如果有人可以指导我完成我需要查看的相应步骤和源文件,我将非常感激.我认为这些步骤同样适用于当前没有相关后向方法的其他线性代数运算.
非常感谢
我想做的是:
我做了什么:
首先,我创建了如下环境
conda create --name my_env python=3.5
Run Code Online (Sandbox Code Playgroud)
现在,从源代码安装PyTorch的说明如下:
export CMAKE_PREFIX_PATH=[anaconda root directory]
conda install numpy pyyaml setuptools cmake cffi
git clone --recursive https://github.com/pytorch/pytorch
MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是:
anaconda root directory
要在其中CMAKE_PREFIX_PATH.
设置所有内容的目录my_env
?如果您只能回答两个问题之一,那将不胜感激。谢谢!
这应该是一个快速的.当我在PyTorch中使用预定义模块时,我通常可以非常轻松地访问其权重.但是,如果我先将模块包装在nn.Sequential()中,如何访问它们?请看下面的玩具示例
class My_Model_1(nn.Module):
def __init__(self,D_in,D_out):
super(My_Model_1, self).__init__()
self.layer = nn.Linear(D_in,D_out)
def forward(self,x):
out = self.layer(x)
return out
class My_Model_2(nn.Module):
def __init__(self,D_in,D_out):
super(My_Model_2, self).__init__()
self.layer = nn.Sequential(nn.Linear(D_in,D_out))
def forward(self,x):
out = self.layer(x)
return out
model_1 = My_Model_1(10,10)
print(model_1.layer.weight)
model_2 = My_Model_2(10,10)
# How do I print the weights now?
# model_2.layer.0.weight doesn't work.
Run Code Online (Sandbox Code Playgroud) 我很难弄清楚什么是最有效的方法来执行以下操作:
import numpy as np
M = 10
K = 10
ind = np.array([0,1,0,1,0,0,0,1,0,0])
full = np.random.rand(sum(ind),K)
output = np.zeros((M,K))
output[1,:] = full[0,:]
output[3,:] = full[1,:]
output[7,:] = full[2,:]
Run Code Online (Sandbox Code Playgroud)
我想构建输出,它是一个稀疏矩阵,其行以密集矩阵(完整)给出,行索引通过二进制矢量指定。理想情况下,我想避免循环。那可能吗?如果没有,我正在寻找最有效的方法。
我需要多次执行此操作。ind和full会不断变化,因此,我仅提供了一些示例值进行说明。我希望ind相当稀疏(最多10%),M和K都很大(10e2-10e3)。最终,我可能需要在pytorch中执行此操作,但是对于numpy来说,一些不错的过程已经使我步入正轨。
如果您对此问题有一个或多个适当的类别,也请帮助我找到该问题的更适当的标题。
非常感谢,马克斯