0

我正在尝试使用 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 的 Docker作为执行环境。

谢谢你的回答。

4

2 回答 2

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

细节:

在chainer中,to_gpu()几乎在所有情况下都返回None,所以你不能使用方法链。(唯一的例外是chainer.backends.cuda.to_gpu(),它返回 GPU 化的数组。)

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

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

于 2018-09-04T04:05:05.343 回答
0

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

于 2018-09-11T06:35:22.630 回答