파이썬에서 neural network 구현

최근 공부를 시작한 Machine learning이나 Deep learning에 대해서 Python으로 코드를 써 실천해 보았으므로 메모로서. 완전히 초보자용입니다.

덧붙여 이번 기사는 O'Reilly의 「제로로부터 만드는 Deep Learning」을 참고로 하고 있습니다.

Neural Network(3층) 구현



우선 슈퍼 심플하게 아래 이미지와 같은 네트워크를 Python으로 작성해 보겠습니다. (적절한 이미지를 찾을 수 없기 때문에 실제로는 출력 레이어 이외의 각 레이어의 맨 위 노드는 bias unit라고 생각하십시오.) 출력 레이어의 활성화 함수에는 시그모이드 함수를 사용합니다.


우선은 시그모이드 함수의 구현 및 각 층의 가중치를 설정합니다. 또한 bias는 항상 1이라고 가정하고 미리 가중치를 곱해 둡니다.
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def init_network():
    network = {}
    network['w1'] = np.array([[0.2, 0.4, 0.8], [0.7, 0.1, 0.9]])
    network['b1'] = np.array([0.1, 0.3, 0.5])
    network['w2'] = np.array([[0.1, 0.8], [0.6, 0.7], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    network['w3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network['b3'] = np.array([0.1, 0.2])

    return network

그런 다음 입력에서 출력 방향으로 Forward propagation을 수행하는 함수를 만듭니다.
def forward_prop(network, x):
    w1, w2, w3 = network['w1'], network['w2'], network['w3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, w1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, w2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, w3) + b3
    y = a3

    return y

실행하면,
network = init_network()
x = np.array([1.0, 0.5])
y = forward_prop(network, x)
print(y) #[0.33488935 0.73821001]

라는 결과를 얻었습니다. 지금까지 Matlab을 사용하고 있던 몸에서 보면, Numpy의 다차원 어레이는 편리하다고 하는 것과 아마추어 눈에도 코드가 읽기 쉽다고 생각했습니다.

이번에는 출력층의 노드가 2개였기 때문에 보다 심플한 시그모이드 함수로의 구현을 실시했습니다만, 다클래스 분류의 경우에는 softmax 함수인가를 사용하는 일도 있습니다. 또 그 때에는 오버플로우 대책으로서 Normalization이 필요하게 되기도 합니다만, 그 근처는 다음 기사에서 다시 써 가고 싶습니다.

좋은 웹페이지 즐겨찾기