6.3. 単純なレイヤの実装

6.3.1. 乗算レイヤーの実装

[1]:
class MulLayer:
    def __init__(self):
        """
        入力値の保存をするメンバ変数を初期化します

        Attributes
        ----------
        x : int
            入力1
        y : int
            入力2
        """
        self.x = None
        self.y = None

    def forward(self, x, y):
        """
        順伝播の計算をします(乗算)

        Parameters
        ----------
        x : int
            入力1
        y : int
            入力2

        Returns
        -------
        out : int
            計算結果
        """
        self.x = x
        self.y = y
        out = x * y

        return out

    def backward(self, dout):
        """
        逆伝播の計算をします(乗算)

        Parameters
        ----------
        dout : int
            逆伝播で上流から伝わってきた微分

        Returns
        -------
        dx : int
            入力2の微分
        dy : int
            入力1の微分
        """
        dx = dout * self.y
        dy = dout * self.x

        return dx, dy
[2]:
apple = 100
apple_num = 2
tax = 1.1

mul_apple_layer = MulLayer()
mul_tax_layer = MulLayer()

# forward
apple_price = mul_apple_layer.forward(apple, apple_num)
price = mul_tax_layer.forward(apple_price, tax)

# backward
dprice = 1
dapple_price, dtax = mul_tax_layer.backward(dprice)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)

print("price:", int(price))
print("dApple:", dapple)
print("dApple_num:", int(dapple_num))
print("dTax:", dtax)
price: 220
dApple: 2.2
dApple_num: 110
dTax: 200

6.3.2. 加算レイヤの実装

[3]:
class AddLayer:
    def __init__(self):
        """
        何もしない
        """
        pass

    def forward(self, x, y):
        """
        順伝播の計算をします(加算)

        Parameters
        ----------
        x : int
            入力1
        y : int
            入力2

        Returns
        -------
        out : int
            計算結果
        """
        out = x + y

        return out

    def backward(self, dout):
        """
        逆伝播の計算をします(乗算)

        Parameters
        ----------
        dout : int
            逆伝播で上流から伝わってきた微分

        Returns
        -------
        dx : int
            入力2の微分
        dy : int
            入力1の微分
        """
        dx = dout * 1
        dy = dout * 1

        return dx, dy
[4]:
apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1

# layer
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()

# forward
apple_price = mul_apple_layer.forward(apple, apple_num)  # (1)
orange_price = mul_orange_layer.forward(orange, orange_num)  # (2)
all_price = add_apple_orange_layer.forward(apple_price, orange_price)  # (3)
price = mul_tax_layer.forward(all_price, tax)  # (4)

# backward
dprice = 1
dall_price, dtax = mul_tax_layer.backward(dprice)  # (4)
dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price)  # (3)
dorange, dorange_num = mul_orange_layer.backward(dorange_price)  # (2)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)  # (1)

print("price:", int(price))
print("dApple:", dapple)
print("dApple_num:", int(dapple_num))
print("dOrange:", dorange)
print("dOrange_num:", int(dorange_num))
print("dTax:", dtax)
price: 715
dApple: 2.2
dApple_num: 110
dOrange: 3.3000000000000003
dOrange_num: 165
dTax: 650