Цепочка CNN- TypeError: forward () отсутствует 1 обязательный позиционный аргумент: 'x' - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь запустить классификатор на Chainer, но не удалось из-за следующей ошибки:

Я понятия не имею об ошибке, потому что я подтвердил, что итератор фактически отправил пакет тренеру.

Есть ли проблема с моделью нейронной сети?Или неправильный способ подачи данных в модель?

Input.py

from chainer.datasets import split_dataset_random
from chainer.iterators import SerialIterator
from chainer.optimizers import Adam
from chainer.training import Trainer
from chainer.training.updaters import StandardUpdater
from chainer import functions as F, links as L
from chainer import Sequential

import numpy as np

batch_size = 3

X_train = np.ones((9957, 60, 80, 3), dtype=np.float32)
X_train, _ = split_dataset_random(X_train, 8000, seed=0)
train_iter = SerialIterator(X_train, batch_size)

model = Sequential(
    L.Convolution2D(None, 64, 3, 2),
    F.relu,
    L.Convolution2D(64, 32, 3, 2),
    F.relu,
    L.Linear(None, 16),
    F.dropout,
    L.Linear(16, 4)
)

model_loss = L.Classifier(model)
optimizer = Adam()
optimizer.setup(model_loss)
updater = StandardUpdater(train_iter, optimizer)
trainer = Trainer(updater, (25, 'epoch'))

trainer.run()

Stacktrace.py

Exception in main training loop: forward() missing 1 required positional argument: 'x'
Traceback (most recent call last):
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/training/trainer.py", line 315, in run
    update()
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/training/updaters/standard_updater.py", line 165, in update
    self.update_core()
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/training/updaters/standard_updater.py", line 181, in update_core
    optimizer.update(loss_func, in_arrays)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/optimizer.py", line 680, in update
    loss = lossfun(*args, **kwds)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/link.py", line 242, in __call__
    out = forward(*args, **kwargs)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/links/model/classifier.py", line 143, in forward
    self.y = self.predictor(*args, **kwargs)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/link.py", line 242, in __call__
    out = forward(*args, **kwargs)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/sequential.py", line 210, in forward
    x = layer(*x)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/link.py", line 242, in __call__
    out = forward(*args, **kwargs)
Will finalize trainer extensions and updater before reraising the exception.
Traceback (most recent call last):
  File "/home/user/deploy/aaa.py", line 33, in <module>
    trainer.run()
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/training/trainer.py", line 348, in run
    six.reraise(*exc_info)
  File "/home/user/miniconda3/lib/python3.7/site-packages/six.py", line 693, in reraise
    raise value
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/training/trainer.py", line 315, in run
    update()
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/training/updaters/standard_updater.py", line 165, in update
    self.update_core()
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/training/updaters/standard_updater.py", line 181, in update_core
    optimizer.update(loss_func, in_arrays)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/optimizer.py", line 680, in update
    loss = lossfun(*args, **kwds)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/link.py", line 242, in __call__
    out = forward(*args, **kwargs)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/links/model/classifier.py", line 143, in forward
    self.y = self.predictor(*args, **kwargs)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/link.py", line 242, in __call__
    out = forward(*args, **kwargs)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/sequential.py", line 210, in forward
    x = layer(*x)
  File "/home/user/miniconda3/lib/python3.7/site-packages/chainer/link.py", line 242, in __call__
    out = forward(*args, **kwargs)
TypeError: forward() missing 1 required positional argument: 'x'

Есть ли проблема смодель нейронной сети или способ подачи данных в модель?Пожалуйста, дайте мне знать, если вам нужно увидеть весь код

1 Ответ

0 голосов
/ 19 декабря 2018

Все, что вам нужно было сделать, это дать кортежу ndarray и int для модели, потому что это спецификация L.Classifier.

Есть ли проблема смодель нейронной сети?Или, как данные были введены в модель неверно?

Следовательно, абсолютный ответ - «как данные были введены в модель неверно».

В следующем коде я определил класс, унаследовавший DatasetMixin для подачи кортежа ndarray и int.(Это обычный способ работы Chainer)

Следует отметить, что входной аргумент L.Convolution2D должен быть ndarray, форма которого (пакет, канал, ширина, высота).Поэтому я перенесу массив в набор данных.

Solution.py

from chainer.datasets import split_dataset_random
from chainer.iterators import SerialIterator
from chainer.optimizers import Adam
from chainer.training import Trainer
from chainer.training.updaters import StandardUpdater
from chainer import functions as F, links as L
from chainer import Sequential

from chainer.dataset import DatasetMixin

import numpy as np


class MyDataset(DatasetMixin):
    def __init__(self, X, labels):
        super(MyDataset, self).__init__()
        self.X_ = X
        self.labels_ = labels
        self.size_ = X.shape[0]

    def __len__(self):
        return self.size_

    def get_example(self, i):
        return np.transpose(self.X_[i, ...], (2, 0, 1)), self.labels_[i]


batch_size = 3

X_train = np.ones((9957, 60, 80, 3), dtype=np.float32)
label_train = np.random.randint(0, 4, (9957,), dtype=np.int32)
dataset = MyDataset(X_train, label_train)
dataset_train, _ = split_dataset_random(dataset, 8000, seed=0)
train_iter = SerialIterator(dataset_train, batch_size)

model = Sequential(
    L.Convolution2D(None, 64, 3, 2),
    F.relu,
    L.Convolution2D(64, 32, 3, 2),
    F.relu,
    L.Linear(None, 16),
    F.dropout,
    L.Linear(16, 4)
)

model_loss = L.Classifier(model)
optimizer = Adam()
optimizer.setup(model_loss)
updater = StandardUpdater(train_iter, optimizer)
trainer = Trainer(updater, (25, 'epoch'))

trainer.run()
...