코딩일지(2024-01-29)
고전 신경망과 현대 신경망의 데이터 흐름에 대해서 발표준비
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') #컨볼루션 수행
- 넘파이 배열 생성
-3에서부터 3까지의 구간을 스무개의 등간격으로 나눈 배열을 생성하고 x에 넣어줍니다.
- 1차원 신호 함수 생성
x에 대한 1차원 신호 함수를 만들어 주고 f에 넣어줍니다. 이 함수는 정규 분포 형태를 따르는 가우시안 함수로, np.exp를 사용하여 계산되고, 그 값에 255를 곱해서 스케일링을 해줍니다.최종적으로 astype(“int32”)를 사용하여 정수형으로 변환됩니다.
- 컨볼루션에 사용될 필터 생성
미분을 수행하기 위한 필터를 생성합니다. 이는 1차원 컨볼루션 사용될 필터입니다.
- 컨볼루션 수행
np.convolve 함수를 상용하여 f와 g의 컨볼루션을 계산합니다. mode=’same’은 출력 배열의 크기를 입력배열과 동일하게 설정합니다.이를 위해서 가장자리에 0짜리 패딩을 채워주게 됩니다. 그리고 컨볼루션 연산을 직접 해보셨다면 알겠지만, 적분때리기 전에 먼저 필터를 반대로 뒤집는 작업을 해주는데요, 여기서도 마찬가지로 이를 위해 g[::-1]을 적어주었습니다.
9.3.1.2 2차원 합성곱에서 막혔다..
/image-20240129122812758.png)
일단 chatGPT에 넣어서 원인분석을 진행했다.
이 경고는 scipy.misc.face의 함수가 Scipy 버전1.10.0에서 더이상 사용되지 않는다는 것이었다. 뭔말이냐면, sicpy패키지 안에 서브패키지로 misc가 있고 그 안에 face라는 함수가 있는대, 그게 더이상 사용이 안된다는, deprecated되었다는 것이었다.(아무래도 교재 내용이 조금 옛날거라 그런것 같다. 이해하자).
그럼 아예 face()를 못쓰냐?그건 아니다. 현재 라이브러리의 표준문서가 조금 바뀐것 같은데, dataset이라는 서브패키지에 이 face()함수가 옮겨갔다고 한다. (참고로 이 face함수는 얼굴이미지를 가져오는 함수이다.)
그래서 문제가 해결되었나 싶은데 한번 더 문제가 발생했다. 버전충돌이었다.
대충 보니 paramiko라는 모듈이 설치되지 않았다고 한다. 그러니 설치!
/image-20240129123604717.png)
이후 정상적으로 인터프리팅이 되었다. 코드는 다음과 같다.
코드에 대해 간략하게 설명하자면, 이미지를 전처리할때 수행하는 작업중 하나인 필터링(컨볼루션)을 수행하는 예제라고 한다. 컨볼루션은 이미지에서 특징과 패턴을 감지하는데 사용되는다는 것을 잊지 말자.
# 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')
- 모듈 임포트
sigal과 datasets라는 서브모듈에서 convole2d와 face라는 함수를 가져와줍니다.
- 이미지 로드해오고 잘라내기
face()에 True인수를 넣어 와꾸이미지를 가져와줍니다. 그 후에 이미지를 입력규격에 맞추기 위해 슬라이싱 작업을 하게 됩니다. 가로방향으로는 처음 512픽셀을 남기고, 세로 방향으로는 이미지 전체너비 -612에서 -100까지의 부분만 남기게 됩니다.
- 필터 정의하고 컨볼루션 수행하기
3x3 크기의 필터 k를 정의하고, convolve2d함수를 사용하여 이미지 img에 이 필터를 적용합니다. mode='same'은 출력의 크기를 입력과 동일하게 유지하도록 지정합니다.
댓글남기기