1 분 소요

고전 신경망과 현대 신경망의 데이터 흐름에 대해서 발표준비

9.3.1.1 1차원 합성곱이라 하는데 뭔말인지 모르겠다.

예전에 신호및 시스템을 배웠을때 컨볼루션연산이라 함은 한 함수가 다른 함수 위에서 밀어서 이동하는 방식으로 진행하는 함수라 했다.

아래 예제코드는 1차원 신호에 대해서 컨볼루션 연산을 수행하는 예제라고 한다.

x = np.linspace(-3, 3, 20) #넘파이 배열 생성
f = (255*np.exp(-0.5*x**2)).astype("int32") #1차원 신호 함수 생성
g = np.array([-1,0,1]) #컨볼루션에 사용될 필터 생성		
fp = np.convolve(f, g[::-1], mode='same') #컨볼루션 수행
  1. 넘파이 배열 생성

-3에서부터 3까지의 구간을 스무개의 등간격으로 나눈 배열을 생성하고 x에 넣어줍니다.

  1. 1차원 신호 함수 생성

x에 대한 1차원 신호 함수를 만들어 주고 f에 넣어줍니다. 이 함수는 정규 분포 형태를 따르는 가우시안 함수로, np.exp를 사용하여 계산되고, 그 값에 255를 곱해서 스케일링을 해줍니다.최종적으로 astype(“int32”)를 사용하여 정수형으로 변환됩니다.

  1. 컨볼루션에 사용될 필터 생성

미분을 수행하기 위한 필터를 생성합니다. 이는 1차원 컨볼루션 사용될 필터입니다.

  1. 컨볼루션 수행

np.convolve 함수를 상용하여 f와 g의 컨볼루션을 계산합니다. mode=’same’은 출력 배열의 크기를 입력배열과 동일하게 설정합니다.이를 위해서 가장자리에 0짜리 패딩을 채워주게 됩니다. 그리고 컨볼루션 연산을 직접 해보셨다면 알겠지만, 적분때리기 전에 먼저 필터를 반대로 뒤집는 작업을 해주는데요, 여기서도 마찬가지로 이를 위해 g[::-1]을 적어주었습니다.

9.3.1.2 2차원 합성곱에서 막혔다..

image-20240129122812758

일단 chatGPT에 넣어서 원인분석을 진행했다.

이 경고는 scipy.misc.face의 함수가 Scipy 버전1.10.0에서 더이상 사용되지 않는다는 것이었다. 뭔말이냐면, sicpy패키지 안에 서브패키지로 misc가 있고 그 안에 face라는 함수가 있는대, 그게 더이상 사용이 안된다는, deprecated되었다는 것이었다.(아무래도 교재 내용이 조금 옛날거라 그런것 같다. 이해하자).

그럼 아예 face()를 못쓰냐?그건 아니다. 현재 라이브러리의 표준문서가 조금 바뀐것 같은데, dataset이라는 서브패키지에 이 face()함수가 옮겨갔다고 한다. (참고로 이 face함수는 얼굴이미지를 가져오는 함수이다.)

그래서 문제가 해결되었나 싶은데 한번 더 문제가 발생했다. 버전충돌이었다.

대충 보니 paramiko라는 모듈이 설치되지 않았다고 한다. 그러니 설치!

image-20240129123604717

이후 정상적으로 인터프리팅이 되었다. 코드는 다음과 같다.

코드에 대해 간략하게 설명하자면, 이미지를 전처리할때 수행하는 작업중 하나인 필터링(컨볼루션)을 수행하는 예제라고 한다. 컨볼루션은 이미지에서 특징과 패턴을 감지하는데 사용되는다는 것을 잊지 말자.

# 1. 모듈 임포트
from scipy.signal import convolve2d
from scipy.datasets import face

# 2. 이미지 로드해오과 잘라내기
img = face(True)
img = img[:512, (img.shape[1]-612):(img.shape[1]-100)]

# 3. 필터 정의하고 컨볼루션 수행하기
k = np.array([[1,0,0],[0,-8,0],[0,0,3]])
c = convolve2d(img, k, mode='same')
  1. 모듈 임포트

sigal과 datasets라는 서브모듈에서 convole2d와 face라는 함수를 가져와줍니다.

  1. 이미지 로드해오고 잘라내기

face()에 True인수를 넣어 와꾸이미지를 가져와줍니다. 그 후에 이미지를 입력규격에 맞추기 위해 슬라이싱 작업을 하게 됩니다. 가로방향으로는 처음 512픽셀을 남기고, 세로 방향으로는 이미지 전체너비 -612에서 -100까지의 부분만 남기게 됩니다.

  1. 필터 정의하고 컨볼루션 수행하기

3x3 크기의 필터 k를 정의하고, convolve2d함수를 사용하여 이미지 img에 이 필터를 적용합니다. mode='same'은 출력의 크기를 입력과 동일하게 유지하도록 지정합니다.

댓글남기기