본문 바로가기

dev_AI_framework

dense layer 수정, cu 코드 연동, 깊은 복사를 통한 cal_graph input, output 값 설정

def call(self, input_data):
        """
        Dense 층의 연산을 수행합니다.

        연산 수행 과정을 수정하자.
        """

        if input_data.ndim != 2 or input_data.shape[1] != self.input_shape[1]:
            raise ValueError(f"Invalid input shape. Expected shape (batch_size, {self.input_shape[1]}), "
                            f"but got {input_data.shape}.")

        batch_size, input_dim = input_data.shape
        output_dim = self.weights.shape[1]

        # 행렬 곱셈 연산, 결과를 저장할 result 행렬을 미리 생성한다.
        result = np.zeros((batch_size, output_dim), dtype=np.float32)

        # ✅ 백엔드 연산: 행렬 곱셈 (반환값 사용 X, result에 직접 저장됨)
        matrix_ops.matrix_mul(input_data, self.weights, result)

        mul_result = copy.deepcopy(result)

        # 계산 그래프 구성 : 행렬 곱셈
        mul_nodes = self.cal_graph.matrix_multiply(input_data.tolist(), self.weights.tolist(), result.tolist())
    
        # 편향 추가
        if self.bias is not None:
            # 편향 값을 행렬로 변환
            bias_reshaped = np.tile(self.bias, (batch_size, 1))

            matrix_ops.matrix_add(result, bias_reshaped, result)

            # 계산 그래프 구성 : 편향 추가
            add_nodes = self.cal_graph.matrix_add(mul_result.tolist(), bias_reshaped.tolist(), result.tolist())

            self.cal_graph.connect_graphs(add_nodes, mul_nodes)

        # 활성화 함수 적용
        if self.activation is not None:
            result, act_node_list = self.activation(result)

        return result

연산 결과를 저장할 result 값의 생성과

cal_graph 의 input 값을 지정하기 위한 mul_result 의 생성, 해당 값은 result 의 깊은 복사를 통해 변형이 생기지 않도록 함

✅ Dense Layer Output:
[[4. 4. 4.]
 [8. 8. 8.]]

✅ Computation Graph:
Node(operation=add, input=3.0, weight=1.0, output=4.0)
  Node(operation=add, input=0.0, weight=0.0, output=3.0)
    Node(operation=multiply, input=1.0, weight=1.0, output=0.0)
    Node(operation=multiply, input=2.0, weight=1.0, output=0.0)
Node(operation=add, input=3.0, weight=1.0, output=4.0)
  Node(operation=add, input=0.0, weight=0.0, output=3.0)
    Node(operation=multiply, input=1.0, weight=1.0, output=0.0)
    Node(operation=multiply, input=2.0, weight=1.0, output=0.0)
Node(operation=add, input=3.0, weight=1.0, output=4.0)
  Node(operation=add, input=0.0, weight=0.0, output=3.0)
    Node(operation=multiply, input=1.0, weight=1.0, output=0.0)
    Node(operation=multiply, input=2.0, weight=1.0, output=0.0)
Node(operation=add, input=7.0, weight=1.0, output=8.0)
  Node(operation=add, input=0.0, weight=0.0, output=7.0)
    Node(operation=multiply, input=3.0, weight=1.0, output=0.0)
    Node(operation=multiply, input=4.0, weight=1.0, output=0.0)
Node(operation=add, input=7.0, weight=1.0, output=8.0)
  Node(operation=add, input=0.0, weight=0.0, output=7.0)
    Node(operation=multiply, input=3.0, weight=1.0, output=0.0)
    Node(operation=multiply, input=4.0, weight=1.0, output=0.0)
Node(operation=add, input=7.0, weight=1.0, output=8.0)
  Node(operation=add, input=0.0, weight=0.0, output=7.0)
    Node(operation=multiply, input=3.0, weight=1.0, output=0.0)
    Node(operation=multiply, input=4.0, weight=1.0, output=0.0)

input, output 값이 올바르게 지정된 것을 볼 수 있음

 

이제 할 일로 각 activation function 의 backend 연산 구현 필요