def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
output = []
for i in range(step_num):
print(x)
output.append(x)
print(output)
grad = numerical_gradient(f, x)
x -= lr * grad
신경망 공부 중 갱신 과정을 확인하기 위해 리스트에 값을 담으려고 했다. 하지만 제대로 담기지 않는 것을 확인할 수 있었다. print해보면 x는 제대로 움직이고 있는데 막상 리스트는 for문을 반복한 만큼 마지막 값을 가지고 있었다. 논리적으로 맞는거 같은데 왜 안될까 한참 고민했다.
이유는 같은 개체를 재사용하고 있기 때문이다. 객체지향에 익숙하지 않아서인데 x를 저장한다고 실제로 x의 value가 저장되는 것이 아니라 x의 address를 저장하기 때문이다. 그렇기때문에 바라보고 있는 x값이 변하니 전부 다 변하게 되고 저런 참사가 났던 것이다. (내가 잘 이해한거였으면 좋겠다)
결과적으로 x가 아닌 x의 value를 직접 넣어주면 해결된다.
def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
output = []
for i in range(step_num):
output.append([x[0],x[1]])
grad = numerical_gradient(f, x)
x -= lr * grad
return output
#[[-3.0, 4.0], [-2.399999999999622, 3.200000000000088], [-1.9199999999982538, 2.5599999999976717], [-1.535999999998758, 2.0479999999971596], [-1.228799999998806, 1.6383999999969276]]
'Python > DeepLearning' 카테고리의 다른 글
역.전.파의 기본 개념 (0) | 2019.04.25 |
---|---|
Tensorflow(keras)를 이용해 MNIST digits 분류해보기 (0) | 2019.04.24 |
퍼셉트론에서 신경망으로(7) (0) | 2019.04.23 |
퍼셉트론에서 신경망으로(6) (0) | 2019.04.23 |
퍼셉트론에서 신경망으로(5) (0) | 2019.04.23 |