활성화 함수에 따른 뉴런의 출력을 그리드 맵으로 시각화
다음의 책에 보면,
실체가 손에 잡히는 딥러닝
; http://www.yes24.com/Product/Goods/74258238
뉴런의 가중치와 편향에 대한 시각화를 한 내용이 나옵니다. 그중에서 활성 함수가 sigmoid인 파이썬 소스 코드(\DeepLearning_Examples.zip\Chapter4\4-6_single_neuron.ipynb)가 공개되어 있는데요.
[예제 파일] 실체가 손에 잡히는 딥러닝, 기초부터 실전 프로그래밍
; https://www.onlybook.co.kr/entry/deeplearingexamples?category=738122
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(-1.0, 1.0, 0.2)
Y = np.arange(-1.0, 1.0, 0.2)
Z = np.zeros((10, 10))
w_x = 2.5
w_y = 3.0
bias = 0.1
for i in range(10):
for j in range(10):
u = X[i] * w_x + Y[j] * w_y + bias
y = 1 / (1 + np.exp(-u))
Z[j][i ] = y
plt.imshow(Z, "gray", vmin = 0.0, vmax = 1.0)
plt.colorbar();
plt.show();
실은 이걸 C#으로도 해보려고 지난번 글을 쓴 것입니다. ^^
C# - PLplot의 16색 이상을 표현하는 방법과 subpage를 이용한 그리드 맵 표현
; https://www.sysnet.pe.kr/2/0/11960
게다가 sigmoid 활성 함수는 전에도 한번 소개한 적이 있는데,
C# - 로지스틱 회귀를 이용한 분류
; https://www.sysnet.pe.kr/2/0/11955
따라서 입력 값 x0와 x1을 받는 뉴런이 있다고 할 때,
각각의 출력값을 그리드 맵으로 출력하는 C# 코드를 다음과 같이 작성할 수 있습니다.
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var X0 = Utils.ARange(-1.0, 1.0, 0.1).ToArray();
var X1 = Utils.ARange(-1.0, 1.0, 0.1).ToArray();
double[,] Y = new double[10, 10];
double w0 = 1.0; // 가중치를 모두 1.0으로 고정 (물론 임의로 설정해서 테스트 가능)
double w1 = 1.0;
double bias = 0.1; // 편향을 0.1로 고정 (물론 임의로 설정해서 테스트 가능)
for (int i = 0; i < 10; i ++)
{
for (int j = 0; j < 10; j ++)
{
double u = X0[i] * w0 + X1[j] * w1 + bias;
double y = 1 / (1 + Math.Exp(-u));
Y[j, i] = y;
}
}
Gridmap grid = new Gridmap();
grid.Show(Y);
}
}
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
책에서는 나오지 않지만, 기왕 해보는 김에 위의 소스 코드에서 활성화 함수만 바꿔가며 그리드 맵 출력을 할 수 있습니다. 다음은 각각의 결과입니다. (가중치와 편향을 바꿔가면서 테스트하면 더 재미있을 것입니다. ^^)
[계단 함수] == (x) => (x <= 0) ? 0 : 1
[tanh] == (x) => Math.Tanh(x)
[ReLU] == (x) => (x <= 0) ? 0 : x
[Leaky ReLU] == (x) => (x <= 0) ? 0.01 * x : x
[항등 함수] == (x) => x
[소프트맥스 함수] == (x) => Math.Exp(x) / sumOfAllExp
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]