ml_framework

Dense

명징직조지훈 2023. 4. 19. 19:14
import numpy as np
import activation_function

# Dense 클래스
class Dense():
  #가중치
  weight = []

  #편향값
  bias = []
    
  # 각 층별 노드들의 입력, 활성화 함수 연산 전의 값
  node_input = []

  # 각 층별 노드들의 출력
  node_output = []

  # 타겟, 목푯값
  target = []

  # 각 층의 델타 값의 저장
  delta = []

  # 활성화 함수
  activation = activation_function()

  # 가중치 업데이트 크기
  weight_update_arr = []

  # Dense 층
  def Dense_layer(self, input_node, hidden_node, activation = "same"):
    """
    Args:
      activation : 활성화 함수 종류
      padding : 패딩 종류
      input_shape : 입력값의 크기
    """
    Dense_dict = dict()
    Dense_dict['layer_type'] = "Dense"
    Dense_dict['input_node'] = input_node
    Dense_dict['hidden_node'] = hidden_node
    Dense_dict['activation'] = activation
    return Dense_dict

  # train Dense
  def train(self, dict, data):
    hidden_node = dict['hidden_node']
    input_node = dict['input_node']

    # 가중치의 임의 생성, 입력, 은닉 노드의 개수에 따라 가중치가 생성된다.
    weight = np.random.rand(input_node, hidden_node)

    #편향값의 임의 생성, 동일한 편향 값을 사용한다.
    bias = np.random.rand(1)

    # 가중치 값 저장
    self.weight.append(weight)

    # 편향 값 저장
    self.bias.append(bias)

    # 노드 입력값의 저장 필요, 활성화 미분 함수의 값을 구하기 위해 필요
    self.node_input.append(input)

    #가중치와 노드 출력의 행렬곱연산, 편향값 덧셈
    hidden_input = weight @ input + bias
            
    if(dict['activation'] == 'sigmoid'):
      #노드 입력과 활성화 함수 연산을 통한 노드 출력 계산
      # cnn 에선 0과 1 사이의 결과를 출력해야 하기 때문에 시그모이드 활성화 함수를 사용
      output = self.activation.sigmoid(hidden_input)

    # 노드 출력의 저장
    self.node_output.append(output)

Dense 층에 저장되어야 할 정보들에는 뭐가 있을까?

dense 층은 노드의 개수 정보, 활성화 함수의 종류 등의 정보가 저장될 수 있다. 

우선 위 두가지의 정보만을 가진 Dense 층의 구현, 

Dense 클래스 내에서 이러한 연산이 수행될 수 있을 것,

 

딕셔러니 파일을 입력받고, 이에 따라 연산의 수행 가능할 것,