인프런 커뮤니티 질문&답변

홍성민님의 프로필 이미지
홍성민

작성한 질문수

딥러닝 CNN 완벽 가이드 - Fundamental 편

Numpy array와 Tensor 차이, 그리고 fit() 메소드 상세 설명

안녕하세요 교수님. fit()과 모델 생성할때 input 질문있습니다.

작성

·

271

0

안녕하세요 교수님.

model을 생성할때는 입력값을 만약 2차원 gray scale (크기 = 28 28)이 들어왔다면 tensor값을 받아야하니 이것을 3차원(1 28 * 28)으로 받는것을 이해했습니다.

만약 RGB 이미지라면 (크기 : 28 28 3 )이 값을 그대로 받는건가요?? channel값은 임의의로 정했습니다.

그렇다면 fit()함수는 x값과 y값은 numpy로 받는데 이 값을 numpy에서 tensor값으로 변경시켜주지않고 받는것일까요??

 

궁금합니다

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

  1. model을 생성할때는 입력값을 만약 2차원 gray scale (크기 = 28 28)이 들어왔다면 tensor값을 받아야하니 이것을 3차원(1 28 * 28)으로 받는것을 이해했습니다.

    => 음, tensor 값을 받아야 해서 3차원으로 받는 것은 아닙니다.

    이미지 데이터의 차원과 관계없이 Dense Layer 기반으로 모델을 설정할 경우 Dense Layer의 입력값은 배치(Batch)를 제외하면 1차원 값이 들어와야 합니다. 그러니까 (28, 28) 2차원 shape 이미지 데이터는 784 원소를 가지는 1차원 데이터 값이 되어야 Dense Layer로 입력할 수 있는데, Dense Layer는 반드시 배치 데이터를 감안해서 입력을 받기 때문에 배치 사이즈를 32로 한다면 32개의 이미지 데이터를 2차원으로 만들어서 입력을 해줘야 합니다. 즉 (32, 784)로 입력이 됩니다. 하지만 Batch size로 2차원 데이터를 만드는 것은 Keras 모델에서 자동으로 해주게 되므로 관여할 필요가 없습니다.

tr_images의 shape는 (51000, 28, 28)입니다. 즉 51000개의 28x28 2차원 이미지를 가지고 있는 전체적으로 3차원 데이터 입니다. 모델에 입력할 때 맨 앞의 차원은 batch에서 활용합니다. 따라서 fit()메소드에 입력될 때는 흑백 이미지 데이터는 갯수를 감안해서 3차원, rgb 컬러 이미지는 4차원을 입력해 줍니다.

모델에서는 맨 앞의 차원을 이미지의 갯수로 가정하므로 이를 batch로 생각합니다. 따라서 모델의 처리에 사용되는 데이터는 기본적으로 맨 앞 차원을 제거합니다. 그래서 create_model() 함수의 맨 처음의 Input Layer가 바로 2차원이 됩니다( 흑백 이미지의 경우).

근데 중요한 것은 Dense Layer는 무조건 1차원 데이터(배치를 제외하고)를 입력으로 받습니다. 때문에 Input Layer 다음에 Flatten Layer를 2차원 데이터를 1차원으로 만듭니다.

컬러 이미지 일때도 비슷합니다. 배치를 제외한 3차원 데이터를 모델에서 입력 받기 위해 Input shape는 3차원이 되어야 합니다. 하지만 Dense Layer를 사용한다면 무조건 1차원이 되어야 하므로 Flatten을 적용해서 1차원으로 만들어 줍니다.

이렇게 Dense Layer를 1차원으로 기존 데이터를 뭉개 버리기 때문에 원본 데이터의 특성을 살리지 못하는 모델이 만들어 지기 쉽니다.

이후 강의에서는 CNN 을 통해서 3차원 데이터를 그대로 처리하는 방식을 배우시게 될 겁니다.

  1. 그렇다면 fit()함수는 x값과 y값은 numpy로 받는데 이 값을 numpy에서 tensor값으로 변경시켜주지않고 받는것일까요??

    => fit() 메소드는 numpy값을 입력 받을 수도 있고, tensor값을 입력 받을 수도 있습니다. 하지만 모델에 입력될 때는 반드시 Tensor로 입력되어야 하므로 fit()은 numpy값을 입력 받으면 모델에 적용시 자동으로 Tensor로 변환합니다.

감사합니다.

홍성민님의 프로필 이미지
홍성민

작성한 질문수

질문하기