中間層で複数の入力層を結合したい。

448 views
Skip to first unread message

dag...@gmail.com

unread,
Jan 4, 2018, 10:14:30 AM1/4/18
to Chainer Japanese User Group
私は、入力層として5つの入力を持つデータを5ブロック作成し(5x5=25)、各ブロック1つに対してH1(隠れ層1)で50のニューロンと結合(5x50ニューロン)、更にH2(隠れ層2)で全てのブロックを結合(つまりニューロンは250個)し、
後は同じ構成(各層250個のニューロン)で10層の隠れ層、最後に5出力を持つディープニューラルネットワークを作成しようとしています。


そこで下記のページを基に、コードを組んでみましたが、エラーが出てコードが動きません。どのように修正すれば良いでしょうか?
■Chainerで中間層を分岐させて学習してみる


■エラー個所とメッセージ
l11=L.Linear(250, 5),
^
SyntaxError: keyword argument repeated


■動かないコード
※全部を乗せると長くなりすぎるのでスニペッドを載せます。
class MyChain(Chain):
    def __init__(self, train=True):
        super(MyChain, self).__init__(
            l11=L.Linear(5, 50),
            l12=L.Linear(5, 50),
            l13=L.Linear(5, 50),
            l14=L.Linear(5, 50),
            l15=L.Linear(5, 50),
            l2=L.Linear(250, 250),
            l3=L.Linear(250, 250),
            l4=L.Linear(250, 250),
            l5=L.Linear(250, 250),
            l6=L.Linear(250, 250),
            l7=L.Linear(250, 250),
            l8=L.Linear(250, 250),
            l9=L.Linear(250, 250),
            l10=L.Linear(250, 250),
            l11=L.Linear(250, 5),
        )
        self.train = train
        
    def  predict(self,x1,x2,x3,x4,x5):
        h11 = F.relu(self.l11(x1))
        h12 = F.relu(self.l12(x2))
        h13 = F.relu(self.l13(x3))
        h14 = F.relu(self.l14(x4))
        h15 = F.relu(self.l15(x5))
        H_link=[]
        H_link.append(h11)
        H_link.append(h12)
        H_link.append(h13)
        H_link.append(h14)
        H_link.append(h15)
        h2 = F.relu(self.l2(H_link))
        h3 = F.relu(self.l3(h2))
        h4 = F.relu(self.l4(h3))
        h5 = F.relu(self.l5(h4))
        h6 = F.relu(self.l6(h5))
        h7 = F.relu(self.l7(h6))
        h8 = F.relu(self.l8(h7))
        h9 = F.relu(self.l9(h8))
        h10 = F.relu(self.l10(h9))
        y = self.l11(h10)
        return y

# NNモデルを宣言
model = MyChain()

# 損失関数の計算
#   損失関数には自乗誤差(MSE)を使用
def forward(x1, y, model):
    t = model.predict(x1)
    loss = F.mean_squared_error(t, y)
    return loss

# chainerのoptimizer
#   最適化のアルゴリズムには Adam を使用
optimizer = optimizers.Adam()
# modelのパラメータをoptimizerに渡す
optimizer.setup(model)

# パラメータの学習を繰り返す
for i in range(0,1000):
    loss = forward(train_X1, train_Y, model)
    print(loss.data)  # 現状のMSEを表示
    optimizer.update(forward, train_X1, train_Y, model)



■動くコード
※下記のスニペッド(入力層を隠れ層で結合させない)だと動きます。
class MyChain(Chain):
    def __init__(self, train=True):
        super(MyChain, self).__init__(
            l1=L.Linear(5, 250),
            l2=L.Linear(250, 250),
            l3=L.Linear(250, 250),
            l4=L.Linear(250, 250),
            l5=L.Linear(250, 250),
            l6=L.Linear(250, 250),
            l7=L.Linear(250, 250),
            l8=L.Linear(250, 250),
            l9=L.Linear(250, 250),
            l10=L.Linear(250, 250),
            l11=L.Linear(250, 5),
        )
        self.train = train
        
    def  predict(self,x1):
        h1 = F.relu(self.l1(x1))
        h2 = F.relu(self.l2(h1))
        h3 = F.relu(self.l3(h2))
        h4 = F.relu(self.l4(h3))
        h5 = F.relu(self.l5(h4))
        h6 = F.relu(self.l6(h5))
        h7 = F.relu(self.l7(h6))
        h8 = F.relu(self.l8(h7))
        h9 = F.relu(self.l9(h8))
        h10 = F.relu(self.l10(h9))
        y = self.l11(h10)
        return y

# NNモデルを宣言
model = MyChain()

# 損失関数の計算
#   損失関数には自乗誤差(MSE)を使用
def forward(x1, y, model):
    t = model.predict(x1)
    loss = F.mean_squared_error(t, y)
    return loss

# chainerのoptimizer
#   最適化のアルゴリズムには Adam を使用
optimizer = optimizers.Adam()
# modelのパラメータをoptimizerに渡す
optimizer.setup(model)

# パラメータの学習を繰り返す
for i in range(0,1000):
    loss = forward(train_X1, train_Y, model)
    print(loss.data)  # 現状のMSEを表示
    optimizer.update(forward, train_X1, train_Y, model)

堀田駿仁

unread,
Jan 4, 2018, 7:59:26 PM1/4/18
to Chainer Japanese User Group
class MyChain(Chain):
    def __init__(self, train=True):
        super(MyChain, self).__init__(
         >   l11=L.Linear(5, 50),
            l12=L.Linear(5, 50),
            l13=L.Linear(5, 50),
            l14=L.Linear(5, 50),
            l15=L.Linear(5, 50),
            l2=L.Linear(250, 250),
            l3=L.Linear(250, 250),
            l4=L.Linear(250, 250),
            l5=L.Linear(250, 250),
            l6=L.Linear(250, 250),
            l7=L.Linear(250, 250),
            l8=L.Linear(250, 250),
            l9=L.Linear(250, 250),
            l10=L.Linear(250, 250),
        >    l11=L.Linear(250, 5),
        )

>のところが両方ともl11になっていることのエラーかと思われますので、どちらかの変数名を変えてください。
加えて最後のl11の文末にある「,」もエラーの原因です。


2018年1月5日金曜日 0時14分30秒 UTC+9 dag...@gmail.com:

dag...@gmail.com

unread,
Jan 8, 2018, 10:22:08 AM1/8/18
to Chainer Japanese User Group
本当にお恥ずかしい…。全く気が付かず申し訳ありません…。
そしてありがとうございます…。

2018年1月5日金曜日 9時59分26秒 UTC+9 堀田駿仁:

dag...@gmail.com

unread,
Jan 8, 2018, 5:51:01 PM1/8/18
to Chainer Japanese User Group
ご指摘の点(変数名の重複)を修正したのですが、

h2 = F.relu(self.l2(H_link))
^TypeError: numpy.ndarray or cuda.ndarray are expected.

とエラーが出たので、更に修正して、
h2 = F.relu(self.l2(np.array(H_link, dtype=np.float32)))
^ValueError: setting an array element with a sequence.

と、またまたエラーが出たので再修正して、
h2 = F.relu(self.l2(Variable(np.array(H_link, dtype=np.float32))))
^ValueError: setting an array element with a sequence.

とエラーが出てきて、なかなか動くコードにならない…。難しいですね。

なお、データは、
x1 = pd.concat([data1, data2, data3, data4, data5], axis=1)
x1 = np.array(x1, dtype=np.float32)
とpandasデータをnumpy.arrayの実数型に変換して使っておりました。

2018年1月5日金曜日 0時14分30秒 UTC+9 dag...@gmail.com:

堀田駿仁

unread,
Jan 9, 2018, 8:09:19 PM1/9/18
to Chainer Japanese User Group
そのエラーですと、self.l2に入力するデータの大きさと、self.l2の初期化で指定している入力数が合っていない可能性があります。
そのため、H_linkのデータ長を確認してください

2018年1月9日火曜日 7時51分01秒 UTC+9 dag...@gmail.com:

日暮大輝

unread,
Jan 10, 2018, 9:59:00 AM1/10/18
to Chainer Japanese User Group
chainerで計算グラフを維持したまま素子を結合する際はconcat関数を使います。

今回のコードですと、

h2 = F.relu(self.l2(F.concat(H_link)))

このようにすれば動くかと思います。

2018年1月9日火曜日 7時51分01秒 UTC+9 dag...@gmail.com:

dag...@gmail.com

unread,
Jan 16, 2018, 6:20:35 PM1/16/18
to Chainer Japanese User Group
返信が遅くなりましてすみません。教えていただいた方法で巧く行きました。ありがとうございます。
Reply all
Reply to author
Forward
0 new messages