私は、入力層として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)