CNN의 볼륨 처리(주로im2col)는python 문외한해설(기계학습#5)

0. 시작


CNN (권적신경망) 의'권적처리'에서im2col을 중심으로 설명한다.샘플 원본은python으로 썼기 때문에python 문외한에게는 난이도가 높습니다!필자의 이해 과정을 공유하다.
전체, 이하 참고서를 통해 기재한다.
재토콘은 오라일리 일본에 의연하다
이것은 누구나 다 아는 좋은 책이다.설명은 이해하기 쉽다.
그리고 만약 이 페이지에 이상한 기록이 있다면 모두 나의 무지와 잘못 때문이다.

1. 전체


1.1. CNN


이것에 관해서는 상세한 설명을 생략한다.
[참조 페이지]
Convolutional Neural Network

1.2. 처리 범위


CNN에서는 이미지 데이터부터 축소하는 부분만 있습니다.im2col도 기재되어 있습니다.
중점은python에서 어떻게 실현하는가이다.

1.3. 접는다


충전 처리를 실시한 이미지 데이터에 대해 줄무늬 너비에 필터를 곱하여 특징 지도를 만드는 처리입니다.
상술한 참고 페이지를 제외하고 아래의 페이지도 이해하기 쉽다.
따라서 설명을 생략합니다.
[참조 페이지]
권적 신경 네트워크

2. 전제지식:numpy수조


2.1. 고차원 그룹의 데이터 지정 방법


다음은'수조를 지정하는 방법'과'어디의 인상을 가리키는 것'이다.
예는 3D 배열입니다.

2.2. 배열 형식 변환


그룹을 변환할 때, 값이 어떤 순서로 저장되는지 보십시오.
예제에서는 3D 배열을 1차원 배열로 설정합니다.

A.shape는 (2,3,4), A가 1차원으로 배열된 B.shape는 (24)
요점은 A[1,0,3]=B[1*(3*4)+0*(3)+3]=B[15]이다.
값 (인덱스) 의 지정 방법, 저장 방법, 상기 이미지 맵과 관련하여 이해하는 것이 좋습니다.
설명과 프로그램에 "reshape(A*B*C,-1)"등을 쓸 때 매개 변수의 곱셈 순서는 상기 값의 추출을 고려하여 기재해야 한다.

2.3. 지원


그룹의 배열 순서 (reshape에서 어떤 순서로 배열되는지) 는 ndarray의 기본 설정을 전제로 합니다.
reshape에서order라는 매개 변수를 사용하면reshape에서 값을 얻는 순서가 변경됩니다.자세한 내용은 다음과 같습니다.
[참조 페이지]
NumPy의 reshape를 사용하여 패턴을 모양으로 변환

3. 볼륨 처리


3.1. 하고 있는 일


이미지 데이터에 필터(볼륨)를 적용하여 데이터의 특징을 추출합니다.

3.2. 처리 고속화→매트릭스 연산화→im2col


이미지 데이터에서 필터를 직접 직관적으로 인코딩하면 계산 시간이 길어집니다.
numpy의 매트릭스 계산 속도는 더 빠르지만, 반대로 for문장은 시간이 걸린다.
그러므로 극력 행렬 연산으로 이것을 실현합시다!생각
대략
① 고차원 그룹을 행렬(2차원 그룹)으로 변환한다.
② 행렬적을 구한다.
③ 행렬을 고차원 그룹으로 변환합니다.
하계.

im2col은 이미지 데이터 (집합) 를 하나의 행렬로 하는 함수입니다.

4. im2col


4.1. 필터 매트릭스 변환


필터의 데이터도 다차원적이다.im2col을 고려하기 전에 이 필터를 매트릭스화하는 방법을 고려하십시오.
앞절에서 본 그림을 우선 배열표로 만들어라.filter_org(FN, C, FH, FW)로 기재됩니다.
FN 필터가 있으므로 이미지 데이터 그룹에 적용해야 합니다.
직관적으로 "필터 정보"×필터의 수를 고려하는 것은 매우 간단하다.
이미지 데이터의 배열과 행렬적을 형성하기 위해 세로에'필터 정보'를 저장하고 이 필터 정보를 가로로 배열하는 형식을 취한다.
행렬의 세로 방향은 필터의 데이터(C*FH*FW)입니다.
즉, 필터 행렬로 filter_col(C*FH*FW, FN)을 사용하고 싶습니다.

결론은 필터의 매트릭스 변환
filter_col = filter_org.reshape(FN, -1).T
하계.갑자기, filter_org.새로 고칠 수 없습니다(-1, FN).2. 전제 지식에서 기술한 바와 같이 (FN, C, FH, FW) 순서를 고려하지 않고reshape를 진행하면 생각한 대로 값을 추출할 수 없다.
im2col에 이 필터의 형식이 있다는 것을 기억하십시오.

4.2. 이미지 데이터의 매트릭스 변환


어떤 대열로 줄을 서야 할지 고려하다.
아까 매트릭스 형식은 필터 형식이 있다고 했는데 필터 크기는 filter_col(C*FH*FW,FN).행렬 변환된 이미지 파일을im_col로서,im_col 및 filter_col과의 행렬 곱셈을 얻기 위해im_col 열의 크기는 filter_col 줄의 크기와 같아야 합니다.즉, C*FH*FW.

이어서,im_col의 세로로 어떤 값을 입력하는 것이 적당한지 고려하십시오.
filter_col의 행렬 적을 고려하면 첫 번째 열은 필터 "0000"을 곱합니다.두 번째 열은 필터 "0001", 세 번째 열은... 이렇게 연결합니다.
첫 번째 열의 경우 필터 "0000"에 곱한 이미지 데이터를 위에서 아래로 순차적으로 저장해야 합니다.즉, 볼륨의 계산 방법을 고려하여 이미지 데이터의 초기부터 필터'0000'을 줄무늬의 값을 가로로 뛰어넘어 배열한다.

값의 개수는 얼마입니까?그것은 (N*OH*OW)입니다.
N은 이미지 데이터의 수입니다.OH, OW입니다. 단, 이것은 권적 후의 데이터 사이즈(의 세로와 가로)를 나타냅니다.
  • 이미지 높이 H×너비 W
  • 필터 높이 FH×너비 FH
  • 크로스오버 S
  • 채우기 종횡은 모두 P이다
  • 문서 레지스트리에 항목을 추가합니다.
  • OH = (H + 2P - FH)/S +1
  • OW = (W + 2P - FW)/S +1

  • 결론적으로 이미지 데이터의 변환 후 사이즈는im_col(N*OH*OW,C*FH*FW).
    여기까지는im2col의 설치를 읽을 수 있습니다 (너무 길다...!)

    4.3. im2col 구현


    이상의 내용을 바탕으로im2col입니다.
    모두가 알고 있는 실현이지만 관건적인 곳에만 코드로 기재한다.분위기만 잡아주세요."영장서"등에서 설치를 확인하십시오.
    우선 함수와 그 매개 변수다.
    # 関数の引数は
    # 画像データ群、フィルタの高さ、フィルタの幅、縦横のストライド、縦横のパディング
    def im2col(im_org, FH, FW, S, P):
    
    우리 각 데이터의 크기를 규정합시다.
        N, C, H, W = im_org.shape
        OH = (H + 2 * P - FH)//S + 1
        OW = (W + 2 * P - FW)//S + 1
    
    이미지 데이터를 미리 채웁니다.
    이미지 데이터 필터를 적용합니다.
    우선im2col의 반환값을 정의합니다.
        im_col = np.zeros((N, C, FH, FW, OH, OW))
    
    필터 각 요소(FH, FW의 2차원 데이터)에 적용되는 이미지 데이터
    조목조목 어려운 동시에 (OH, OW의 2차원 데이터) 획득,im_col에 저장합니다.
    # (y,x)は(FH,FW)のフィルタの各要素。
        for y in range(FH):
            y_max = y + S * OH
            for x in range(FW):
                x_max = x + S * OW 
                im_col[:, :, y, x, :, :] = img_org[:, :, y:y_max:S, x:x_max:S]
    
    for 문장의 가장 안쪽에 있는 노란색 섹션은 다음과 같습니다.

    그리고 변형을 목적으로 하는 형상이 끝납니다.
    # (N, C, FH, FW, OH, OW) →軸入替→ (N, OH, OW, C, FH, FW)
    #    →形式変換→ (N*OH*CH, C*FH*FW)
        im_col = im_col.transpose(0, 4, 5, 1, 2, 3) 
        im_col = im_col.reshape(N * out_h * out_w, -1)
        return im_col
    

    5.im2col 이후


    그리고 필터를 매트릭스로 변환하고 곱해서 결과 매트릭스를 다차원 그룹으로 되돌려줍니다.
    아무튼 그렇습니다.

    6. 끝(뱀발)


    정말 어려워요. 저한테는...잊기 전에 정리할 수 있어서 다행이다.
    나는 기계 학습에서python,numpy를 이해하는 것이 매우 중요하다는 것을 깊이 느꼈다.

    좋은 웹페이지 즐겨찾기