объект кортежа не вызывается при создании CNN в Pytorch - PullRequest
0 голосов
/ 26 апреля 2019

Я новичок в нейронных сетях и в настоящее время пытаюсь создать CNN с 2 слоями конв.

class CNN(nn.Module):
  def __init__(self):
    super(CNN, self).__init__()
    self.conv1 = nn.Conv2d(in_channels = 1, out_channels = 16, kernel_size = 3, stride = 1, padding = 1), 
    self.maxp1 = nn.MaxPool2d(2),
    self.conv2 = nn.Conv2d(in_channels = 16, out_channels = 16, kernel_size = 3, stride = 1, padding = 1),
    self.fc1 = nn.Linear(16, 64),
    self.fc2 = nn.Linear(64, 10)

  def forward(self, x):
    x = nn.ReLU(self.maxp1(self.conv1(x)))
    x = nn.ReLU(self.maxp2(self.conv1(x)))
    x = x.view(x.size(0), -1)
    x = nn.ReLu(self.fc1(x))
    return self.fc2

То, что я пытался сделать, это активация ConvLayer-ReLu - Макс. Пул 2x2 - ConvLayer - Активация ReLu - Flatten Layer - Полностью подключиться - ReLu - Полностью подключено

Однако, это дает мне TypeError: 'tuple' object is not callable на x = nn.ReLU(self.maxp1(self.conv1(x)))

Как я могу это исправить?

1 Ответ

0 голосов
/ 27 апреля 2019

Вы можете изменить nn.ReLU на F.relu.

Если вы хотите использовать nn.ReLU(), лучше объявить его как часть __init__ метода и вызвать его позже в forward():

class CNN(nn.Module):
  def __init__(self):
    super(CNN, self).__init__()
    self.conv1 = nn.Conv2d(in_channels = 1, out_channels = 16, kernel_size = 3, stride = 1, padding = 1), 
    self.maxp1 = nn.MaxPool2d(2),
    self.conv2 = nn.Conv2d(in_channels = 16, out_channels = 16, kernel_size = 3, stride = 1, padding = 1),
    self.fc1 = nn.Linear(16, 64),
    self.fc2 = nn.Linear(64, 10)
    self.relu = nn.ReLU(inplace=True)

  def forward(self, x):
    x = self.relu(self.maxp1(self.conv1(x)))
    x = self.relu(self.maxp2(self.conv1(x)))
    x = x.view(x.size(0), -1)
    x = self.relu(self.fc1(x))
    return self.fc2
...