DonHurry

step11. κ°€λ³€ 길이 인수(μˆœμ „νŒŒ 편) λ³Έλ¬Έ

DeZero/πŸ—»μ œ2κ³ μ§€

step11. κ°€λ³€ 길이 인수(μˆœμ „νŒŒ 편)

_도녁 2023. 1. 12. 00:01

πŸ“’ λ³Έ ν¬μŠ€νŒ…μ€ λ°‘λ°”λ‹₯λΆ€ν„° μ‹œμž‘ν•˜λŠ” λ”₯λŸ¬λ‹3을 기반으둜 μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³ , 개인적인 곡뢀λ₯Ό μœ„ν•΄ μž‘μ„±ν•˜λŠ” ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ ꡐ재 ꡬ맀λ₯Ό κ°•λ ₯ μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€.

 

 

μ§€κΈˆκΉŒμ§€λŠ” ν•¨μˆ˜μ— μž…μΆœλ ₯ λ³€μˆ˜κ°€ ν•˜λ‚˜μ”©μΈ 경우만 κ³ λ €ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν•¨μˆ˜μ— 따라 μ—¬λŸ¬ 개의 λ³€μˆ˜λ₯Ό μž…λ ₯받기도 ν•©λ‹ˆλ‹€. ν˜Ήμ€ 좜λ ₯이 μ—¬λŸ¬ 개인 ν•¨μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ DeZeroκ°€ κ°€λ³€ 길이 μž…μΆœλ ₯을 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν™•μž₯ν•  κ²λ‹ˆλ‹€. κ°€λ³€ κΈΈμ΄λŠ” 인수 λ˜λŠ” λ°˜ν™˜κ°’μ˜ μˆ˜κ°€ λ‹¬λΌμ§ˆ 수 μžˆλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

κ°€λ³€ 길이 μž…μΆœλ ₯을 ν‘œν˜„ν•˜λ €λ©΄ λ³€μˆ˜λ“€μ„ 리슀트 λ˜λŠ” νŠœν”Œμ— λ„£μ–΄ μ²˜λ¦¬ν•˜λ©΄ νŽΈν•©λ‹ˆλ‹€. Function ν΄λž˜μŠ€λŠ” μ§€κΈˆκ³Ό 같이 ν•˜λ‚˜μ˜ 인수만 λ°›κ³  ν•˜λ‚˜μ˜ 값을 λ°˜ν™˜ν•˜μ§€λ§Œ, μΈμˆ˜μ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž…λ§Œ 리슀트둜 λ°”κΎΈλŠ” κ²ƒμž…λ‹ˆλ‹€.

class Function:
    def __call__(self, inputs):
        xs = [x.data for x in inputs]
        ys = self.forward(xs)
        outputs = [Variable(as_array(y)) for y in ys]

        for output in outputs:
            output.set_creator(self)
        self.inputs = inputs
        self.outputs = outputs
        return outputs

    def forward(self, xs):
        raise NotImplementedError()
    
    def backward(self, gys):
        raise NotImplementedError()

 

λ‹€μŒμœΌλ‘œ μƒˆλ‘œμš΄ Function 클래슀λ₯Ό ν™œμš©ν•˜μ—¬ ꡬ체적인 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜κ² μŠ΅λ‹ˆλ‹€. 첫 번째둜 λ§μ…ˆμ„ ν•΄μ£ΌλŠ” Add ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μΈμˆ˜μ™€ λ°˜ν™˜κ°’μ΄ 리슀트 λ˜λŠ” νŠœν”Œμž„μ„ κ³ λ €ν•˜μ—¬ forward λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

class Add(Function):
    def forward(self, xs):
        x0, x1 = xs
        y = x0 + x1
        return (y, )  # νŠœν”Œ ν˜•νƒœλ‘œ λ°˜ν™˜

 

λ‹€μŒκ³Ό 같이 Add 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, μž…λ ₯ λ³€μˆ˜λ₯Ό λ¦¬μŠ€νŠΈμ— 미리 λ‹΄μ•„μ•Ό ν•˜λŠ” λ“±μ˜ λΆˆνŽΈν•¨μ΄ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— κ°œμ„ μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

xs = [Variable(np.array(2)), Variable(np.array(3))]  # 리슀트둜 μ€€λΉ„
f = Add()
ys = f(xs)  # ys νŠœν”Œ
y = ys[0]
print(y.data)  # 5