前回DNNで実装した指し手を予測するモデルについて、持ち駒を値が2値の9×9の画像として入力していたが、全て同じ値の画像の畳み込みを行ってもすべて同じ値の結果になるため、計算に無駄がある。
また、エッジ部分ではパディングを行うため、悪影響がある。
ネットワーク構成
class MyChain(Chain):
def __init__(self):
super(MyChain, self).__init__(
l1_1=L.Convolution2D(in_channels = None, out_channels = k, ksize = 3, pad = 1),
l1_2=L.Convolution2D(in_channels = None, out_channels = k, ksize = 1),
l2=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l3=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l4=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l5=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l6=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l7=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l8=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l9=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l10=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l11=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l12=L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1),
l13=L.Convolution2D(in_channels = k, out_channels = len(shogi.PIECE_TYPES), ksize = 1, nobias = True),
l13_2=L.Bias(shape=(9*9*len(shogi.PIECE_TYPES)))
)
def __call__(self, x1, x2):
u1_1 = self.l1_1(x1)
u1_2_1 = self.l1_2(x2)
u1_2_2 = F.unpooling_2d(u1_2_1, 9, outsize=(9, 9))
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))
h11 = F.relu(self.l11(h10))
h12 = F.relu(self.l12(h11))
h13 = self.l13(h12)
return self.l13_2(F.reshape(h13, (len(h13.data), 9*9*len(shogi.PIECE_TYPES))))