이 게시물은 '밑바닥부터 시작하는 딥러닝'의 일부 코드의 이해를 돕고자 작성되었다.
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} 과 같은 식으로 생각해볼 수 있다.
'머신 러닝 및 파이썬 > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
Ch.5 오차역전파법/ 5.1 계산 그래프, 5.2 연쇄법칙, 5.3 역전파, 5.4 단순한 계층 구현 (0) | 2020.03.03 |
---|---|
Ch.4 신경망 학습/ 4.5 학습 알고리즘 구현하기 (0) | 2020.03.03 |
Ch.4 신경망 학습/ 4.3 수치 미분 4.4 기울기 (0) | 2020.02.27 |
Ch.4 신경망 학습/ 4.2 손실함수 (0) | 2020.02.26 |
Ch.4 신경망 학습/ 4.1 데이터 주도학습 (0) | 2020.02.24 |