이 게시물은 '밑바닥부터 시작하는 딥러닝'의 일부 코드의 이해를 돕고자 작성되었다. 

 

4단원 '신경망에서 기울기' 부분에 다음과 같은 코드가 있다.

class simpleNet:
    def __init__(self):
        self.W = np.random.randn(2,3) # 정규분포로 초기화
        #randn은 가우시안 분포로 랜덤값 부여
    def predict(self, x):
        return np.dot(x, self.W)

    def loss(self, x, t):
        z = self.predict(x)
        y = softmax(z)
        loss = cross_entropy_error(y, t)

        return loss

x = np.array([0.6, 0.9])
t = np.array([0, 0, 1])

net = simpleNet()

f = lambda w: net.loss(x, t)
dW = numerical_gradient(f, net.W)

여기서 f=~~으로 시작하는 lambda식의 이해를 돕고자 예시를 통해서 lambda를 공부해보았다.

 

먼저 lambda는 anonymous function으로 한 번만 사용할 함수 정도로 이해하고 글을 보면 좋을 것 같다.

 

def fun1(x):
    return x+1

def fun2(f, x):
    k = f(x)+x    
    return k

다음과 같이 두 개의 함수를 정의하자

특이한 부분은 fun2 인데, fun2는 인자로 함수와 변수를 받아, 그 함수에 인자값을 넣어 처리한다.

##개인적으로 굉장히 생소한 부분

 

이제 람다식을 사용해보자

fun3 = lambda res: fun1(2)

lambda는 res를 반환? 하는데 res에 대한 소개 없이 단순히 res: fun1(2)라고만 되어있다. 

그렇다면 대체 fun3는 어떤 상태인 것일까.

fun3
Out[27]: <function __main__.<lambda>(res)>

fun3(3) 
Out[28]: 3 

fun3(2) 
Out[29]: 3 

fun3(t) 
Out[30]: 3

 

콘솔로 찍어보면 다음과 같은 재밌는 결과가 도출된다! 즉 인자 자체를 받지 않았기 때문에 무슨 짓을 하든 fun1(2) = 3 인 결과가 나오는 것이다.

 

fun2(fun3, 1)
Out[26]: 4

 

그러므로 fun2에 fun3를 넣는다면 다음과 같은 결과를 얻어낼 수 있다.

 

이제 lambda에서 직접 x값을 활용하는 예시를 보자

fun4 = lambda x: fun1(x)-1

이것은 수학으로 생각한다면 {x|x-1} 과 같은 식으로 생각해볼 수 있다. 

+ Recent posts