我正在尝试使用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作为执行环境。
谢谢您的回答。
答案 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。它已经修复,正在等待检查。一段时间后,它将被提交。