Ссылка Chainer's становится "NoneType" - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь построить сеть LSTM с несколькими графическими процессорами, используя Chainer (v4.0.0b1). Как в следующем коде.

import numpy as np
import chainer
from chainer import optimizers, Chain, training, iterators, serializers, cuda, Variable
import chainer.functions as F
import chainer.links as L

...

class Network(Chain):
    def __init__(self):
        super(Network, self).__init__()
        with self.init_scope():
            ...
            self.fc1  = L.Liner(3000, 1000).to_gpu(1)
            self.lstm = L.LSTM(1000, 1000).to_gpu(1)
            self.fc2  = L.Liner(1000, 3000).to_gpu(1)
            ...

    def __call__(self, x, t):
        ...

...

Однако ссылка LSTM становится "NoneType". Как в следующей ошибке в вызове.

TypeError: 'NoneType' object is not callble

Я подумал, что это странно, поэтому я отобразил "self.lstm". В результате «Нет» было отображено. Например, fc1, который является «Link», отображается следующим образом.

<chainer.links.connection.linear.Linear object at hogehoge>

Я обнаружил, что "self.lstm" не может быть объявлен ссылкой в ​​"self.lstm = L.LSTM (1000, 1000) .to_gpu (1)". Однако я не знаю, почему я не могу это объявить.

Я использую Docker Chainer's в качестве среды выполнения.

Спасибо, что ответили.

Ответы [ 2 ]

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

Эта ошибка - сумка Chainer. Это было исправлено и ждет проверки. Через некоторое время оно будет совершено.

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

Короче, используйте

class Network(Chain):
    def __init__(self):
        super(Network, self).__init__()
        with self.init_scope():
            ...
            self.fc1  = L.Liner(3000, 1000)
            self.lstm = L.LSTM(1000, 1000)
            self.fc2  = L.Liner(1000, 3000)
            ...

    def __call__(self, x, t):
        ...

model = Network()
model.to_gpu()

Деталь:

В chainer to_gpu () возвращает None почти во всех случаях, поэтому вы не должны использовать цепочку методов. (Единственное исключение - chainer.backends.cuda.to_gpu(), которое возвращает массив с графическим процессором.)

Вместо этого Link.to_gpu () отправляет все свои атрибуты (переменные и ссылки) в графический процессор и заменяет ссылку из объекта в ЦП на ссылку в ГП.

Следовательно, вам не нужно подставлять возвращаемое значение LSTM.to_gpu() для атрибута self.lstm.

...