페이지

2022년 9월 4일 일요일

26.1 시각화 코드 예

 계산 그래프를 시각화하는 함수를 get_dot_graph라는 이름으로 dezero/utils.py에 구현하겠습니다. 우선 이 함수를 사용하는 모습부터 보여드리죠.

import numpy as np

from dezero import Variable

from dezero.utils import get_dot_graph


x0 = Variable(np.array(1.0))

x1 = Variable(np.array(1.0))

y = x0 + x1 # 어떤 계산


# 변수 이름 지정

x0.name = 'x0'

x1.name = 'x1'

y.name = 'y'


txt = get_dot_graph(y, verbose=False)

print(txt)


# dot 파일로 저장

with opoen('sample.dot', 'w') as o:

    o.write(text)


digraph g {
2970165447216 [label="y", color=orange, style=filled]
2970166331232 [label="Add", color=lightblue, style=filled, shape=box]
2970166333008 -> 2970166331232
2970166332576 -> 2970166331232
2970166331232 -> 2970165447216
2970166333008 [label="x0", color=orange, style=filled]
2970166332576 [label="x1", color=orange, style=filled]
}

여기에서 알 수 있듯이 get_dot_grtaph ㅎ마수에는 최종 출력인 변수 y를 인수로 제공합니다. 그러면 출력 변수 y를 기점으로 한 계산 과정을 DOT 언어로 전환한 문자열을 반환합니다(인수 verbose의 역할은 조금 뒤에 설명합니다). 또한 get_dot_graph함수를 호출하기 전에 x0.name = 'x0'과 x1.name ='x1'처럼 Variable인스턴스의 속성에 name을 추가합니다. 계산 그래프를 시각화 할때 변수 노드에 레이블(이름)을 달아주기 위해서입니다.



여기까지가 계산 그래프 시각화의 흐름입니다. 정리하면, 출력 변수를 기점으로 그 변수가 걸어온 계산 과정을 DOT 언어로 표현하는 것입니다. 사실 우리는 이 방법을 이미 알고 있습니다. 역전파를 구현한 논리를ㄹ 거의 그래도 사용하면 되니까요.

역전파는 출력 변수를 기점으로 역방향으로 모든 노드(변수와 함수)를 추적합니다. 이 구조를 활용하여 계산 그래프의 노드를 DOT 언어로 변환할 수 있습니다.



STEP 26 계산 그래프 시각화(2)

이전 단계에서는 DOT 언어를 작성하는 방법을 배웠습니다. 이 지식을 바탕으로어번 단계에서는 DeZero 계싼 그래프를 DOT 언어로 변환하려 합니다. 구체적으로 DeZero에서 실행한 계산을 DOT 언어로 변환하는 기능을 구현할 것입니다.

2.54 노드 연결하기

 노드를 연결하려면 두 노드의 ID를 '->'로 연결하면 됩니다. 예를 들어 1 -> 2라고 쓰면 ID가 1인 노드에서 ID가 2인 노드로 화살표가 그려집니다. 다음 dot 파일을 작성해봅시다.

digraph g{

1 [label="x", color=orange, style=filled]

2 [label="y", color=orange, style=filled]

3 [label="Exp", color=lightblue, style=filled, shape=box]

1 -> 3

3 -> 2

}

이 dot파일로부터 [그림 25-4]를 얻을 수 있습니다.


이철럼 노드들을 화살표로 연결할 수 있습니다. DOT 언어는 이외에도 많은 기능을 제공하지만 우리에게는 지금까지의 짓기이면 충분합니다. 이제 DeZero계산 그래프를 그릴 준비가 끝났습니다. 다음 단계에서는 DeZero 계산 그래프를 DOT 언어로 출력하는 기능을 추가하겠습니다.


25.3 노드에 속성 지정하기

 노드에는 '색'과 '모양'을 지정할 수 있습니다. 방금 사용한 sample.dot 파일을 다음과 같이 수정해봅시다.

digraph g{

1 [label="x", color=orange, style=filled]

2 [label="y", color=orange, style=filled]

}

이전과 마찬가지로 각 줄에는 노드 하나의 정보가 담깁니다. 그러나 이번에는 각 줄이 '1'과 '2' 같은 숫자로 시작하고 있습니다. 이 값은 노드의 ID를 나타냅니다. 그리고 해당 ID의 노드에 부여할 속성을 대괄호 [] 안에 적습니다. 예를 들어 label = "x" 라고 쓰면 노드 안에 x라는 문자가 표시됩니다. color=orange는 노드를 오렌지색으로 그리라는 뜻이고, sstyle=filled는 노드안쪽을 색칠하라는 뜻입니다.

노드 ID는 0이상의 정수이며, 다른 노드와 중복되지 않아야 합니다.

앞에서처럼 터미널에서 dot sample.dot -T png -o sample.png 명령을 실행해보세요. 그러면 [그림 25-2]를 얻을 수 있습니다.



[그림 25-2]처럼 오랜지색 노드가 2개 랜더링되었습니다. 여기에 사각형의 하늘색 노드를 추가해보죠,


digraph g{

1 [label="x", color=orange, style=filled]

2 [label="y", color=orange, style=filled]

3 [label="Exp", color=lightblue, style=filled, shape=box]

}


이와 같이 새로운 노드를 추가하고 속성으로 사각형(box)과 하늘색(lightblue)을 지정합니다. 이 파일로부터는 [그림 25-3]을 얻을 수 있습니다.


원형과 사각형 노드를 그릴 수 있으니, 이것으로 DeZero의 '변수'와 '함수'를 그릴 준비가 끝났습니다. 나머지는 노드들을 화살표로 연결하기만 하면 됩니다.

이책에서는 계산 그패프를 그릴때 변수를 원(타원)으로, 함수를 사각형으로 표현했습니다. 그래서 DOT언어를 사용한 시각화에서도 변수는 원으로, 함수는 사각형으로 그리겠습니다.




25.2 DOT 언어로 그래프 작성하기

 그럼 DOT 언어로 그래프를 그려봅시다. 각자 좋아하는 편집기를 열고 다음 테스트를 입력하세요.

digraph g{

x

y

}

DOT 언어의 문법부터 설명핫겠습니다. 우선 반드시 digraph g {...} 구조여야 합니다. 그리고 그리려는 그래프의 정보가 ... 안에 들어갑니다. 앞의 예에서는 x와 y가 등장하는데, 2개의 노드를 그린다는 뜻입니다. 또한 각 노드는 '줄바꿈'으로 구분해야 합니다.

앞의 내용을 입력한 다음 sample.dot 파일로 저장하고 다음 명령을 실행해보세요.

dot sample.dot -T png -o sample.png

그려면 [그림 25-1]의 이미지가 출력됩니다.



이상으로 DOT 언어를 최대한 간단하게 소개해봤습니다.


25.1 Graphivz 설치하기

 Graphivz는 그래프를 시가화해주는 도구입니다(여기서 '그래프'는 계산 그래프와 같이 노드와 화살표로 이뤄진 데이터 구조를 말합니다). Graphviz를 이용하면 예쁜 그림을 쉽게 그릴 수 있습니다. 우선 설치부터 함께 해보겠습니다.


Graphviz는 원도우, macOS, 리눅스에서 사용할 수 있습니다. 이책에서는 macOS와 우분투 에서의 설치 방법을 소개합니다. 다른 OS에서의 설치 방법은 Graphivz의 웹페이지를 참고하세요(https://graphvizgitlab.io/download/)


STEP 25 계산 그래프 시각화(1)

 DeZero는 이제 복잡한 수식도 쉽게 코드로 옮길 수 있습니다. 실재로 24단계에서는 Goldstein-Price 함수라는 매우 복잡한 함수를 코딩했습니다. 그런데 이런 복잡한 식을 계산할 때 그 뒤편에서는 어떤 '계산 그래프'가 만들어지는 것일까요? 그 전모를 눈으로 직접 확인하고 싶지 않나요? 그런 분들을 위해 이번 단계에서는 계산 그래프를 시각화합니다.


계산 그래프를 시각화하면 문제가 발생했을 때 원인이 되는 부분을 파악하기 쉬워집니다. 또한 더 나은 계산 방법을 발견할 수도 있고, 긴경망의 구조를 3자에게 시각적으로 전달하는 용도로도 활용할 수 있습니다.


시각화 도구도 밑바닥부터 만들 수 있지만 이 책의 주제인 딥러닝에서 조금 탈선하는 느낌이라 외부 자원이 Graphivz를 활용하려 합니다. 이번 단계에서는 주로 Graphivz의 사용법을 설명하고, 다음 단계에서 Graphivz를 사용하여 계산 그래프를 시각화하겠습니다.