在Pytorch中训练一维CNN

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Pytorch中训练一维CNN相关的知识,希望对你有一定的参考价值。

我想训练下面给出的模型。我正在PyTorch中开发一维CNN模型。通常我们在PyTorch中使用数据加载器。但是我没有在我的实现中使用数据加载器。我需要有关如何在pytorch中训练模型的指导。

import torch
import torch.nn as nn
import torch.nn.functional as F

class  CharCNN(nn.Module):
def __init__(self,num_labels=11):
    super(CharCNN, self).__init__()

    self.conv1 = nn.Sequential(
        nn.Conv1d(num_channels, depth_1, kernel_size=kernel_size_1, stride=stride_size),
        nn.ReLU(),
        nn.MaxPool1d(kernel_size=kernel_size_1, stride=stride_size),
        nn.Dropout(0.1),
    )

    self.conv2 = nn.Sequential(
        nn.Conv1d(depth_1, depth_2, kernel_size=kernel_size_2, stride=stride_size),
        nn.ReLU(),
        nn.MaxPool1d(kernel_size=kernel_size_2, stride=stride_size),
        nn.Dropout(0.25)
    )            


    self.fc1 = nn.Sequential(
        nn.Linear(depth_2*kernel_size_2, num_hidden),
        nn.ReLU(),
        nn.Dropout(0.5)
    )

    self.fc2 = nn.Sequential(
        nn.Linear(num_hidden, num_labels),
        nn.ReLU(),
        nn.Dropout(0.5)
    )



def forward(self, x):
    out = self.conv1(x)
    out = self.conv2(out)

    # collapse
    out = x.view(x.size(0), -1)
    # linear layer
    out = self.fc1(out)
    # output layer
    out = self.fc2(out)
    #out = self.log_softmax(x,dim=1)

    return out

我正在像这样训练我的网络:

criterion = nn.CrossEntropyLoss()    
opt = torch.optim.Adam(model.parameters(),lr=learning_rate)


for e in range(training_epochs):
  if(train_on_gpu):
     net.cuda()
    train_losses = []    

   for batch in iterate_minibatches(train_x, train_y, batch_size):
      x, y = batch
      inputs, targets = torch.from_numpy(x), torch.from_numpy(y)
      if(train_on_gpu):
        inputs, targets = inputs.cuda(), targets.cuda()
      opt.zero_grad()   
      output = model(inputs, batch_size)

    loss = criterion(output, targets.long())
    train_losses.append(loss.item())
    loss.backward()
    opt.step()
val_losses = []
accuracy=0
f1score=0
print("Epoch: /...".format(e+1, training_epochs),
              "Train Loss: :.4f...".format(np.mean(train_losses)))

但是我遇到以下错误

          TypeError                                 Traceback (most recent call last)
          <ipython-input-60-3a3df06ef2f8> in <module>
   14             inputs, targets = inputs.cuda(), targets.cuda()
   15         opt.zero_grad()
   ---> 16         output = model(inputs, batch_size)
   17 
   18         loss = criterion(output, targets.long())

   ~\AppData\Local\Continuum\anaconda3\lib\site-packages\torch\nn\modules\module.py in __call__(self, 
   * input, **kwargs)
   530             result = self._slow_forward(*input, **kwargs)
   531         else:
   --> 532             result = self.forward(*input, **kwargs)
   533         for hook in self._forward_hooks.values():
   534             hook_result = hook(self, input, result)

   TypeError: forward() takes 2 positional arguments but 3 were given

请指导我如何解决此问题。

答案

模型的forward方法仅接受一个参数,但您使用两个参数调用它:

output = model(inputs, batch_size)

应该是:

output = model(inputs)

以上是关于在Pytorch中训练一维CNN的主要内容,如果未能解决你的问题,请参考以下文章

一维中的 PyTorch 圆形填充

Pytorch Note9 线性模型和梯度下降

如何在 Pytorch 中将一维 IntTensor 转换为 int

详解pytorch CNN操作

PyTorch:在训练中添加验证错误

在 PyTorch 中保存训练模型的最佳方法是啥? [关闭]