# 합성곱 연산 알고리즘
딥러닝의 필수 알고리즘 ( 퍼셉트론, 합성곱 연산 알고리즘 )
이미지의 형상을 무시하지 않고, 이미지를 그대로 인공 신경망이
학습할 수 있게 해준 수학 행렬 연산
원본 이미지는 학습되어야 하는 데이터이며,
필터는 원본 이미지의 특징을 잡아내는데 사용되는 행렬이다.
이렇게 특징을 잡아서 feature map을 생성해서,
원본 이미지의 형태를 이해하는 것을 합성곱 연산이라고 한다.
일단 행렬의 연산을 하려면 numpy을 사용해야 한다.
numpy는 파이썬에서 기본적으로 지원하지 않는 배열(array) 혹은 행렬(matrix)의 계산을
쉽게 해주는 라이브러리다.
머신러닝에서 많이 사용하는 선형대수학에 관련된 수식을
파이썬에서도 쉽게 프로그래밍할 수 있게 해준다.
예제 : 두 행렬의 덧셈 연산하기
123 201
012 + 012
301 102
a=[[1,2,3],[0,1,2],[3,0,1]]
b=[[2,0,1],[0,1,2],[1,0,2]]
import numpy as np
a2=np.array(a)
b2=np.array(b)
print(a2+b2)
예제 : 두 행렬의 곱셈 연산하기
123 201
012 + 012
301 102
a=[[1,2,3],[0,1,2],[3,0,1]]
b=[[2,0,1],[0,1,2],[1,0,2]]
import numpy as np
a2=np.array(a)
b2=np.array(b)
print(a2*b2)
예제 : 두 원소의 곱으로 출력된 결과의 요소들을 모두 더하기
a=[[1,2,3],[0,1,2],[3,0,1]]
b=[[2,0,1],[0,1,2],[1,0,2]]
import numpy as np
a2=np.array(a)
b2=np.array(b)
result=a2*b2
print(np.sum(result))
예제 : 4x4 행렬을 만들기
import numpy as np
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
print(a2)
예제 : 여기서 3x3 행렬만 짤라오기
import numpy as np
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
print(a2[0:3,0:3]) # 열을 0부터 3미만까지, 행을 0부터 3미만까지
예제 : 4x4 행렬에서 특정 부분 출력하기
import numpy as np
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
print(a2[0:3,1:4])
예제 : 4x4 행렬에서 특정 부분 출력하기2
import numpy as np
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
print(a2[1:4,0:3])
예제 : 4x4 행렬에서 특정 부분 출력하기3
import numpy as np
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
print(a2[1:4,1:4])
예제 : 위 4개의 예제를 한 번에 출력하기
import numpy as np
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
for i in range(2):
for j in range(2):
print(a2[i:i+3,j:j+3])
예제 : 위에서 선택한 4개의 행렬(3x3)과 아래의 filter 행렬(3x3)과의 원소의 곱 출력하기
import numpy as np
f=[[2,3,4],[1,2,3],[2,0,1]]
filter=np.array(f)
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
for i in range(0,2):
for j in range(0,2):
print(a2[i:i+3,j:j+3]*filter)
예제 : 각각 곱해 생긴 리스트 요소의 합을 출력하기
import numpy as np
f=[[2,3,4],[1,2,3],[2,0,1]]
filter=np.array(f)
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
for i in range(0,2):
for j in range(0,2):
print(np.sum(a2[i:i+3,j:j+3]*filter))
예제 : 출력된 4개의 숫자로 2x2 행렬 만들기
import numpy as np
f=[[2,3,4],[1,2,3],[2,0,1]]
filter=np.array(f)
result=[]
a=[[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]]
a2=np.array(a)
for i in range(0,2):
for j in range(0,2):
result.append(np.sum(a2[i:i+3,j:j+3]*filter)) # result에 담기
result2=np.array(result).reshape(2,2) # result 리스트를 넘파이 2x2 행렬로 변경
print(result2)
합성곱 정리 : a2라는 원본 이미지에 filter(랜덤으로 생성한 이미지)를 가지고
원본 이미지를 스트라이드 ( 양 옆, 위 아래로 스캔 - 아까의 이중 for문 ) 하면서
특징을 잡아내 특징 이미지를 추출하는 것 ( result2 )
'나 취준생 > 파이썬' 카테고리의 다른 글
버블 정렬 (0) | 2020.12.23 |
---|---|
이진 탐색 (0) | 2020.12.22 |
폐 사진 이미지를 숫자로 변환 (0) | 2020.12.22 |
웹 스크롤링 연습 ( 유튜브 댓글 ) (0) | 2020.12.22 |
MYSQL, 파이썬 연동 (0) | 2020.12.21 |