파이썬 구현 14

[CV - python] 2D Partial Derivative for Edge Detection (엣지 검출을 위한 2차원 편미분)

코드가 궁금하다면 댓글을 남겨주세요. import numpy as np import cv2 img = cv2.imread('test4.jpg', cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (400, 600)) new_x = np.zeros(img.shape) new_y = np.zeros(img.shape) img = np.pad(img, (1, 1), 'constant', constant_values = 0) mask_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) mask_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]]) for i in range(1, img.shape[0] - m..

[머신러닝 - Python] SIgmoid 계층 구현 (Sigmoid Class Implementation)

1. Sigmoid 함수 sigmoid 함수는 다음과 같습니다. \(y = \frac{1}{1 + exp(-x)}\) 이때 sigmoid 함수를 계산 그래프로 표현하면 아래의 사진과 같습니다. 숝 sigmoid에는 +, * 말고 새로운 exp, / 노드가 추가 되었습니다. 이때 주의해야 할 점은 계산 할 때는 국소적 미분으로 계산해야 한다는 점입니다. 해당 노드는 해당 노드의 미분 값만 계산해야 합니다. 1 단계 / 노드, 즉 \(y = \frac{1}{x}\)를 미분하면 다음 식이 됩니다. \(\frac{\partial y}{\partial x} = -\frac{1}{x ^ 2} = -y^2\) 따라서 상류에서 흘러온 값에 \(-y^2\)을 곱해서 하류로 보냅니다. 여기서 주의해야 할 점은 순전파때 사..

[머신러닝 - Python] ReLU 계층 구현 (ReLU class implementation)

1. ReLU 함수 \(y = \left\{\begin{matrix} x \,\, (x > 0) \\ 0 \,\, (x\leq 0) \end{matrix}\right.\) 이므로 x에 대한 y의 미분은 다음과 같습니다. \(\frac{\partial y}{\partial x} = \left\{\begin{matrix} 1 \,\, (x > 0) \\ 0 \,\, (x\leq 0) \end{matrix}\right.\) 따라서 순전파 때 입력의 크기인 x가 0보다 크면 역전파는 상류의 값을 그대로 흘려보냅니다. 반면, 순전파 때 x가 0보다 작으면 역전파 때는 하류로 신호를 보내지 않습니다. 2. 구현 class Relu: def __init__(self) -> None: self.mask = None d..

[머신러닝 - Python] 덧셈, 곱셈 노드 오차 역전파 구현 (Addition, Multiplication Back Propagation Implementation)

class MulLayer: # 곱셈 계층 def __init__(self) -> None: self.x = None self.y = None def forward(self, x, y): # 순전파, x와 y의 값을 저장해야만 backward때 사용할 수 있다. self.x = x self.y = y out = x * y return out def backward(self, dout): # 역전파로 상위 계층에서의 미분 값 * 반대 노드의 값을 출력한다. dx = dout * self.y dy = dout * self.x return dx, dy class AddLayer: # 덧셈 계층 def __init__(self) -> None: pass def forward(self, x, y): # 순전파, ..

[머신러닝 - Python] 2층 신경망 구현 (Two Layer Net Implementation)

from audioop import cross import sys, os sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))) from common import * import numpy as np class TwoLayerNet: def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01) -> None: # 파라미터를 정규 분포로 초기화 함 self.params = {} self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) self.params['b..

[머신러닝 - Python] 기울기 구현 (Gradient Implementation)

함수 f를 받아서 중앙 차분을 이용하여 수치 미분하는 코드 정확한 미분 값을 구하지는 못하므로 수치 미분이라고 함 아무튼 해당 함수와 특정 좌표를 받아서 h라는 미세한 값을 더하고(A), 뺀 뒤(B), A와 B의 차이를 계산하여 기울기를 구하는 방식 좌표가 n개가 되면 각각의 n의 f 위에서의 기울기를 구한 뒤 반환함 만약 좌표가 2차원이라면 1개의 차원씩 잘라서 계산 후, 반환함 즉, f 함수에서 각각의 좌표에 해당하는 지점에서의 기울기를 구한다. import numpy as np def numerical_gradient(f, x): # 함수 f를 x 좌표에서의 편미분 값을 반환하는 함수 h = 1e-4 grad = np.zeros_like(x) for idx in range(x.size): tmp_v..

[머신러닝 - Python] 손실 함수 - 배치 교차 엔트로피 오차 구현 (Loss Function - Batch Cross Entropy Error Implementation)

cross entropy error의 핵심은 정답에 해당하는 확률 값만 계산한다는 점입니다. 원-핫 인코딩 방식일 때의 코드를 보면 return -np.sum(target * np.log(pred + 1e-7)) / batch_size 라는 코드가 있는데, 이때 target을 log에 곱하는 모습을 볼 수 있습니다. 즉, 원-핫 인코딩 방식이므로 정답에 해당하는 인덱스만 1이고, 나머지 인덱스는 0입니다. 따라서 정답에 해당하는 인덱스를 k라고 한다면, pred[k]의 값만 log취해서 계산합니다. 1 * np.log(pred[k])가 되므로 k에 해당하는 에러율만 나타내고, 나머지 인덱스는 계산하지 않습니다. 마찬가지로 레이블 방식일 때를 보면, return -np.sum(np.log(pred[np.a..

[머신러닝 - Python] 손실함수 - 오차제곱합, 교차엔트로피 합 구현 (Loss Function - Sum of Squares Error, Cross Entropy Error Implementation)

import numpy as np def sum_squares_error(pred, target): # 오차제곱합 return 0.5 * np.sum((pred - target) ** 2) def cross_entropy(pred, target): # 교차 엔트로피 합 delta = 1e-7 # log 0을 계산할 수 없으므로, 아주 작은 값을 넣음 return -np.sum(target * np.log(pred + delta)) if __name__== "__main__": target = np.array([0, 0, 1, 0, 0]) # 2가 정답 pred1 = np.array([0.1, 0.05, 0.6, 0.05, 0.2]) # 2 예측 pred2 = np.array([0.6, 0.1, 0.05,..

[머신러닝 - Python] MNIST 데이터 예측 모델 구현 (MNIST Data Predict Model Implementataion)

해당 코드는 제 작업 공간 기준이므로 import 등이 안 맞을 수 있습니다. 이 점 유의해서 봐주시면 될 것 같습니다. import sys, os import numpy as np import pickle from PIL import Image sys.path.append(os.pardir) from mnist import load_mnist from Activation_Function.func import sigmoid, softmax def img_show(img): pil_img = Image.fromarray(np.uint8(img)) pil_img.show() def show_img(): # 첫 번째 이미지를 출력하는 함수 (input_train, target_train), (input_tes..

[머신러닝 - 이론, Python] 활성화 함수 - 소프트맥스 함수 구현 (Activation Function - Softmax Function Implementation)

머신러닝에서 출력은 분류(Classfication)와 회귀(Regression)가 있습니다. 분류는 해당 데이터가 어느 클래스에 속하느냐의 문제이고, 회귀는 해당 데이터의 연속적인 수치를 예측하는 문제입니다. 회귀의 경우 항등 함수를 이용해서 입력 신호를 그대로 출력해도 되지만, 분류의 경우에는 보통 소프트맥스 함수를 사용합니다. 소프트맥스 함수는 다음과 같습니다. \(y_k = \frac{exp(a_k)}{\sum_{i = 1}^{a} exp(a_i)}\) 따라서 분모는 모든 입력 신호를 exp()해서 더한 값이고, 분자는 원하는 k의 입력신호 a_k의 지수 함수가 됩니다. 따라서 코드로 구현하면 다음과 같습니다. import numpy as np def softmax(a): exp_a = np.exp..