链接器的链接变为“ NoneType”

时间:2018-09-03 10:29:04

标签: python-2.7 lstm chainer

我正在尝试使用Chainer(v4.0.0b1)构建具有多个GPU的LSTM网络。 如以下代码所示。

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”。结果,显示“无”。例如,显示为“ Link”的fc1如下。

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

我发现在“ self.lstm = L.LSTM(1000,1000).to_gpu(1)”中无法将“ self.lstm”声明为链接。但是,我不知道为什么不能声明它。

我使用Chainer's Docker作为执行环境。

谢谢您的回答。

2 个答案:

答案 0 :(得分:0)

简而言之,使用

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()

详细信息:

在链接器中,to_gpu()在几乎所有情况下均返回None,因此您不得使用方法链。 (唯一的例外是chainer.backends.cuda.to_gpu(),它返回GPU数组。)

相反,Link.to_gpu()将其所有属性(变量和链接)发送到GPU,并将引用从CPU上的对象替换为GPU上的对象。

因此,您不必将返回的LSTM.to_gpu()值替换为self.lstm属性。

答案 1 :(得分:0)

此错误是一包Chainer。它已经修复,正在等待检查。一段时间后,它将被提交。