Ссылка Chainer's становится "NoneType"

Я пытаюсь построить сеть 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)". Однако я не знаю, почему я не могу это заявить.

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

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

2 ответа

Решение

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

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

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() отправляет все свои атрибуты (переменные и ссылки) в GPU и заменяет ссылку из объекта в CPU на ссылку в GPU.

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

Другие вопросы по тегам