C# - 3층 구조의 신경망(분류)
지난 글에 이어서,
C# - 3층 구조의 신경망
; https://www.sysnet.pe.kr/2/0/11969
아래의 책에 보면,
실체가 손에 잡히는 딥러닝
; http://www.yes24.com/Product/Goods/74258238
3층 신경망을 이용한 분류 예제를 파이썬 코드로 싣고 있습니다.
# http://nanya-kanya.net/index.php/1232/#outline__1_30
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(-1.0, 1.0, 0.1)
Y = np.arange(-1.0, 1.0, 0.1)
w_im = np.array([[1.0, 2.0],
[2.0, 3.0]])
w_mo = np.array([[ -1.0, 1.0],
[1.0, -1.0]])
b_im = np.array([0.3, -0.3])
b_mo = np.array([0.4, 0.1])
def middle_layer(x, w, b):
u = np.dot(x, w) + b
return 1 / (1 + np.exp(-u))
def output_layer(x, w, b):
u = np.dot(x, w) + b
return np.exp(u) / np.sum(np.exp(u))
x_1 = []
y_1 = []
x_2 = []
y_2 = []
for i in range(20):
for j in range(20):
inp = np.array([X[i], Y[j]])
mid = middle_layer(inp, w_im, b_im)
out = output_layer(mid, w_mo, b_mo)
if out[0] > out[1]:
x_1.append(X[i])
y_1.append(Y[j])
else:
x_2.append(X[i])
y_2.append(Y[j])
plt.scatter(x_1, y_1, marker="+")
plt.scatter(x_2, y_2, marker="o")
plt.show()
역시 C#으로 표현한 후,
using MathNet.Numerics.LinearAlgebra;
using System;
using System.Linq;
using np = PythonUtils;
using vector = MathNet.Numerics.LinearAlgebra.Vector<double>;
using matrix = MathNet.Numerics.LinearAlgebra.Matrix<double>;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
var X = np.arange(-1.0, 1.0, 0.1).ToArray();
var Y = np.arange(-1.0, 1.0, 0.1).ToArray();
List<double> x1 = new List<double>();
List<double> x2 = new List<double>();
List<double> y1 = new List<double>();
List<double> y2 = new List<double>();
matrix w_im = GetMatrix(new[] { 1.0, 2.0 }, new[] { 2.0, 3.0 });
matrix w_mo = GetMatrix(new[] { -1.0, 1.0 }, new[] { 1.0, -1.0 });
vector b_im = GetVector(0.3, -0.3);
vector b_mo = GetVector(0.4, 0.1);
Func<vector, matrix, vector, vector> middle_layer = (x, w, b) =>
{
vector u = x * w + b;
return 1 / (1 + np.exp(-u)); // sigmoid
};
Func<vector, matrix, vector, vector> output_layer = (x, w, b) =>
{
vector u = x * w + b;
return np.exp(u) / np.sum(u); // softmax
};
for (int i = 0; i < X.Length; i++)
{
for (int j = 0; j < Y.Length; j++)
{
var inp = GetVector(X[i], Y[j]);
var mid = middle_layer(inp, w_im, b_im);
var outp = output_layer(mid, w_mo, b_mo);
if (outp[0] > outp[1])
{
x1.Add(X[i]);
y1.Add(Y[j]);
}
else
{
x2.Add(X[i]);
y2.Add(Y[j]);
}
}
}
OutputImage("layer3_neuron_classification.png");
void OutputImage(string fileName)
{
Gridmap grid = new Gridmap(471, 471);
grid.Show(x1.ToArray(), y1.ToArray(), x2.ToArray(), y2.ToArray(), fileName);
}
}
}
실행해 보면 다음의 분류 상태를 볼 수 있습니다.
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]