слишком много аргументов в функции пересылки пользовательского nn-модуля Pytorch - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь создать нейронную сеть в pytorch, которая имеет переменное количество слоев.Моя проблема в том, что, очевидно, я передаю некий итеративный элемент с более чем одним элементом линейному слою, который может принимать только один аргумент.Я просто не понимаю, почему.

Итак, вот код.Сначала я создал свой собственный модуль и позже импортировал его в свой блокнот

import torch

class NNet(torch.nn.Module):
    def __init__(self, layer_shapes, activation_functions):
        super(NNet, self).__init__()
        assert len(layer_shapes) == len(activation_functions) + 1
        self.layer_shapes = layer_shapes
        self.activation_functions = activation_functions

        linear_functions = list()
        for i in range(len(self.layer_shapes)-1):
            linear_functions.append(torch.nn.Linear(
                    self.layer_shapes[i], self.layer_shapes[i+1]))

        self.linear_functions = linear_functions

    def parameters(self):
        parameters = list()
        for function in self.linear_functions:
            parameters = parameters+list(function.parameters())

        return parameters 

    def forward(self, x):
        assert x.shape[1] == self.layer_shapes[0]
        y = x
        for i in range(len(self.layer_shapes)-1):
            lin = self.linear_functions[i](y)
            y = self.activation_functions[i](lin)
        return y

В блокноте ошибка в функции forward при y = self.activation_functions[i](self.linear_functions[i](y))

Теперь я пытаюсь использоватьнабор данных MNIST, предоставленный torchvision и использующий мой собственный модуль.

batch_size = 100
epochs = 500
learning_rate = 0.001




train_set = torchvision.datasets.MNIST(root = 
                                       '../../data',
                                        train=True,
                          transform=torchvision.transforms.ToTensor(),
                                        download=True)

test_set = torchvision.datasets.MNIST(root = 
                                      '../../data',
                                      train=False,                                      
                          transform=torchvision.transforms.ToTensor(),
                                   download=True)

train_loader = torch.utils.data.DataLoader(dataset=train_set, 
                                           batch_size=batch_size, 
                                           shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_set, 
                                          batch_size=batch_size, 
                                          shuffle=False)

model = nnet.NNet([784, 16, 10], [torch.nn.Tanh, 
                                  torch.nn.Softmax(dim=1)])

loss_function = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

loss_items = list()

for t in range(epochs):
    for i, (images, labels) in enumerate(train_loader):
        images = images.reshape(-1,28*28)

        outputs = model(images)
        loss = loss_function(outputs, labels)
        loss_items.append(loss.item())

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

Этот последний цикл for приводит к ошибке:

TypeError                      Traceback (most recent call last)
<ipython-input-6-4ccb4b105a41> in <module>()
      5         images = images.reshape(-1,28*28)
      6 
----> 7         outputs = model(images)
      8         loss = loss_function(outputs, labels)
      9         loss_items.append(loss.item())

~/.local/lib/python3.6/site-packages/torch/nn/modules/module.py in 
__call__(self, *input, **kwargs)
    475             result = self._slow_forward(*input, **kwargs)
    476         else:
--> 477             result = self.forward(*input, **kwargs)
    478         for hook in self._forward_hooks.values():
    479             hook_result = hook(self, input, result)

~/Desktop/Archive/Computing/Projects/Python/ai/neural_network.py in 
forward(self, x)
     28         for i in range(len(self.layer_shapes)-1):
     29             lin = self.linear_functions[i](y)
---> 30             y = self.activation_functions[i](lin)
     31         return y
     32 

TypeError: __init__() takes 1 positional argument but 2 were given

Я уверен, что кто-то может сказать мне, почему этопроисходит, но кто-то может дать мне полезную стратегию отладки здесь?Я новичок в pytorch, и я сомневаюсь, что это будет моей последней проблемой.Таким образом, стратегия для исследования этих вещей была бы полезна.

Буду признателен за любую информацию.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Возможно, вы захотите использовать последовательный класс

import torch.nn as nn

class NNet(nn.Module):
    def __init__(self, idim, hdim, odim, depth):
        super().__init__()
        layers = [nn.Linear(idim, hdim)]
        layers += [nn.Linear(hdim, hdim)
                   for i in range(depth)]
        layers += [nn.Linear(hdim, odim)]
        self.net = nn.Sequential(*layers)

    def forward(self, x):
        return self.net(x)

Это также учитывает параметры и т. Д.

0 голосов
/ 30 сентября 2018

В определении model я забыл скобки в классе torch.nn.Tanh.Это должно быть torch.nn.Tanh ()

Я продолжаю думать, что это функции, а не классы.У меня еще есть кое-что исправить, но я рад, что увидел это.Так расстраивает.Я нашел это, по сути, поместив операторы assert и print по всему коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...