Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pytorch 从零开始的Skorch训练对象_Pytorch_Skorch - Fatal编程技术网

Pytorch 从零开始的Skorch训练对象

Pytorch 从零开始的Skorch训练对象,pytorch,skorch,Pytorch,Skorch,我正在尝试使用skorch类在分类器上执行GridSearch。 我试着使用vanillaNeuralNetClassifier对象运行,但我还没有找到一种只传递Adam优化器可训练权重的方法(我使用预先训练过的嵌入,我希望将它们冻结)。如果一个模块被初始化,然后使用optimizer\uu params选项传递这些权重是可行的,但是模块需要一个未初始化的模型。有办法解决这个问题吗 net = NeuralNetClassifier(module=RNN, module__vocab_size=

我正在尝试使用skorch类在分类器上执行GridSearch。 我试着使用vanilla
NeuralNetClassifier
对象运行,但我还没有找到一种只传递Adam优化器可训练权重的方法(我使用预先训练过的嵌入,我希望将它们冻结)。如果一个模块被初始化,然后使用
optimizer\uu params
选项传递这些权重是可行的,但是模块需要一个未初始化的模型。有办法解决这个问题吗

net = NeuralNetClassifier(module=RNN, module__vocab_size=vocab_size, module__hidden_size=hidden_size,
                          module__embedding_dim=embedding_dim, module__pad_id=pad_id,
                          module__dataset=ClaimsDataset, lr=lr, criterion=nn.CrossEntropyLoss,
                          optimizer=torch.optim.Adam, optimizer__weight_decay=35e-3, device='cuda',
                          max_epochs=nb_epochs, warm_start=True)
上面的代码有效。然而,由于批处理大小设置为64,我必须在每个批处理上运行指定数量的历元模型!这不是我想要的行为。如果有人能提出更好的方法,我将不胜感激

我的另一个问题是子类化
skorch.NeuralNet
。我遇到了一个类似的问题:找到一种只将可训练权重传递给Adam optimizer的方法。下面的代码是我到目前为止得到的

class Train(skorch.NeuralNet):
def __init__(self, module, lr, norm, *args, **kwargs):
    self.module = module
    self.lr = lr
    self.norm = norm
    self.params = [p for p in self.module.parameters(self) if p.requires_grad]
    super(Train, self).__init__(*args, **kwargs)

def initialize_optimizer(self):
    self.optimizer = torch.optim.Adam(params=self.params, lr=self.lr, weight_decay=35e-3, amsgrad=True)

def train_step(self, Xi, yi, **fit_params):
    self.module.train()

    self.optimizer.zero_grad()
    yi = variable(yi)

    output = self.module(Xi)

    loss = self.criterion(output, yi)
    loss.backward()

    nn.utils.clip_grad_norm_(self.params, max_norm=self.norm)
    self.optimizer.step()

def score(self, y_t, y_p):
    return accuracy_score(y_t, y_p)
初始化类时会出现以下错误:

Traceback (most recent call last):
File "/snap/pycharm-community/74/helpers/pydev/pydevd.py", line 1664, in <module>
    main()
File "/snap/pycharm-community/74/helpers/pydev/pydevd.py", line 1658, in main
globals = debugger.run(setup['file'], None, None, is_module)
File "/snap/pycharm-community/74/helpers/pydev/pydevd.py", line 1068, in run
pydev_imports.execfile(file, globals, locals)  # execute the script
File "/snap/pycharm-community/74/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "/home/l/Documents/Bsrc/cv.py", line 115, in <module>
    main()
File "/home/l/B/src/cv.py", line 86, in main
    trainer = Train(module=RNN, criterion=nn.CrossEntropyLoss, lr=lr, norm=max_norm)
File "/home/l/B/src/cv.py", line 22, in __init__
   self.params = [p for p in self.module.parameters(self) if p.requires_grad]
File "/home/l/B/src/cv.py", line 22, in <listcomp>
   self.params = [p for p in self.module.parameters(self) if p.requires_grad]
File "/home/l/anaconda3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 739, in parameters
    for name, param in self.named_parameters():
AttributeError: 'Train' object has no attribute 'named_parameters' 
回溯(最近一次呼叫最后一次):
文件“/snap/pycharm community/74/helpers/pydev/pydevd.py”,第1664行,在
main()
文件“/snap/pycharm community/74/helpers/pydev/pydevd.py”,第1658行,主目录
globals=debugger.run(setup['file'],None,None,is_模块)
文件“/snap/pycharm community/74/helpers/pydev/pydevd.py”,第1068行,运行中
pydev_imports.execfile(文件、全局、局部)#执行脚本
文件“/snap/pycharm community/74/helpers/pydev/_pydev_imps/_pydev_execfile.py”,execfile中第18行
exec(编译(内容+“\n”,文件,'exec'),全局,loc)
文件“/home/l/Documents/Bsrc/cv.py”,第115行,在
main()
文件“/home/l/B/src/cv.py”,主文件第86行
培训师=培训(模块=RNN,标准=nn.CrossEntropyLoss,lr=lr,norm=max\U norm)
文件“/home/l/B/src/cv.py”,第22行,在__
self.params=[p表示self.module.parameters(self)中的p,如果p.requires_grad]
文件“/home/l/B/src/cv.py”,第22行,在
self.params=[p表示self.module.parameters(self)中的p,如果p.requires_grad]
参数中的文件“/home/l/anaconda3/lib/python3.6/site packages/torch/nn/modules/module.py”,第739行
对于名称,self.named_parameters()中的参数为:
AttributeError:“Train”对象没有“named_parameters”属性
但是
模块
需要一个未初始化的模型

这是不正确的,您还可以传递一个初始化的模型。在模型参数状态中:

但是,也可以传递实例化模块,例如PyTorch顺序实例

问题是,在传递初始化模型时,您无法将任何
模块\uuuuuuu
参数传递给
NeuralNet
,因为这需要重新初始化模块。但是,如果您想对模块参数进行网格搜索,那么这当然是有问题的

解决方法是覆盖
初始化\u model
并在创建新实例后加载和冻结参数(通过将参数的
requires\u grad
属性设置为
False
):

def _load_embedding_weights(self):
    return torch.randn(1, 100)

def initialize_module(self):
    kwargs = self._get_params_for('module')
    self.module_ = self.module(**kwargs)

    # load weights
    self.module_.embedding0.weight = self._load_embedding_weights()
    # freeze layer
    self.module_.embedding0.weight.requires_grad = False

    return self