Ссылка 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
приписывать.