본문 바로가기

ml_framework

cnn(layer)

딕셔너리 형태로 레이어들이 전달되는 구조,

cnn 연산의 수정,

데이터 입력, cnn 연산의 결과는 각 필터에 의해 cnn 연산이 이뤄진다.

때문에 처음 반복에서 필터의 개수만큼 이를 수행,

해당 필터에 해당하는 임의의 가중치를 생성,

 

입력 데이터 크기, 필터 크기, 스트라이드 값에 따라 연산 결과 크기를 미리 알 수 있다. 이에 맞는 패딩을 수행한다.

 

출력 이미지의 크기는

(W - 1) / s +1

 

        # 각 필터별 연산 결과를 저장 리스트
        filter_result_arr = []

        # 출력 이미지의 크기
        result_shape = int((data.shape[0] - 1) / stride) + 1

        # 패딩이 수행된 입력 데이터의 크기
        data_shape = (filter_size * (result_shape - 1)) + filter_size

        # 입력 받은 필터의 개수만큼 반복
        for filter in range(filter_count):
            # 0으로 초기화된 합성곱 연산 결과 행렬
            result_cnn = np.zeros((result_shape, result_shape))

            # 필터 크기에 맞는 임의의 가중치 생성
            weight = np.random.random(filter_size[0] * filter_size[1]).reshape(filter_size[0], filter_size[1])
            
            # 입력 데이터의 패딩 수행
            data = self.padding(data, data.shape[0] - data_shape)

            # 합성곱 연산 수행
            for col in range(result_shape):
                for row in range(result_shape):
                    result = 0
                    for w_col in range(weight.shape[0]):
                        for w_row in range(weight.shape[1]):
                            result = result + data[col * stride + w_col][row * stride + w_row] * weight[w_col][w_row]
                    result_cnn[col][row] = result

            # 연산 결과의 저장
            filter_result_arr.append(result_cnn)

각 필터에 대한 연산결과가 filter_result_arr 에 저장,

해당 값을 모두 더하여 출력 데이터를 구한다.

        for filter in range(filter_result_arr):
            for col in range(filter.shape[0]):
                for row in range(filter.shape[1]):
                    result_cnn[col][row] = result_cnn[col][row] + filter[col][row]

필터별 연산 결과의 합을 통해 cnn 연산 결과의 획득

        # 입력 데이터의 차원 수 만큼의 반복
        for dimension in range(data.shape[2]):
            
            # 입력 받은 필터의 개수만큼 반복
            for filter in range(filter_count):
                # 0으로 초기화된 합성곱 연산 결과 행렬
                result_cnn = np.zeros((result_shape, result_shape))

                # 필터 크기에 맞는 임의의 가중치 생성
                weight = np.random.random(filter_size[0] * filter_size[1]).reshape(filter_size[0], filter_size[1])

                weight_arr.append(weight)
            
                # 입력 데이터의 패딩 수행
                data = self.padding(data, data.shape[0] - data_shape)

                # 합성곱 연산 수행
                for col in range(result_shape):
                    for row in range(result_shape):
                        result = 0
                        for w_col in range(weight.shape[0]):
                            for w_row in range(weight.shape[1]):
                                result = result + data[col * stride + w_col][row * stride + w_row] * weight[w_col][w_row]
                        result_cnn[col][row] = result

                # 연산 결과의 저장
                filter_result_arr.append(result_cnn)
        
            result_cnn = np.zeros((result_shape, result_shape))

            for filter in range(filter_result_arr):
                for col in range(filter.shape[0]):
                    for row in range(filter.shape[1]):
                        result_cnn[col][row] = result_cnn[col][row] + filter[col][row]

'ml_framework' 카테고리의 다른 글

cnn 정리  (0) 2023.05.11
cnn 연산 수정  (0) 2023.05.09
cnn(layer)  (0) 2023.05.04
gradient_descent(momentum)  (0) 2023.05.02
gradient_descent(1)  (0) 2023.05.02