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 연산 구현 필요
'dev_AI_framework' 카테고리의 다른 글
cu 연산과 계산 그래프 연결 (0) | 2025.03.23 |
---|---|
노드 링크 테스트 (0) | 2025.03.17 |
생성된 계산 그래프에 cu 연산 결과 넣기 (0) | 2025.02.19 |
dense_layer, cuda 연산과 계산 그래프 생성 (0) | 2025.02.17 |
계산 그래프의 output 의 처리는..? (0) | 2025.02.13 |