Inflearn brand logo image

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

황승현님의 프로필 이미지
황승현

작성한 질문수

딥러닝 CNN 완벽 가이드 - Pytorch 버전

Linear Layer 기반으로 FashionMNIST 이미지 판별 모델 만들기 - 02

Frame Work의 근본에 대한 이해

작성

·

24

·

수정됨

0

안녕하세요! 강의 너무 잘 듣고 있습니다. 파이썬 언어 정도만 이해한 상태에서 해당 강의를 수강하고 있습니다.

딥러닝에서 퍼셉트론이 가지고 있는 정의와 은닉층을 통과하면서 '무언가'를 학습하고 output으로 결과를 도출해낸다.

이런 학습 과정을 도와주는 여러 모듈들이 있으며 이는 nn.module이 있다. 정도로 이해 후 현재 Framework2 를 수강중에 있습니다.

여기서 이해가 어려운 부분들이 있습니다.

  1. 이미지 시각화 부분

    1. train_data에서[0][0]과 [0][1]은 이미지와 labes로 이미 페어가 된 자료라고 인지하면 될까요? show_images함수에서 class_names도 원래 약속되어있던 이름을 사람이 인지하기 좋게 이름만 매칭시켜준 것일까요?

  2. Linear 모델 생성 부분

    1. SimpleLinearModel_01 클래스가 초기화를 통해서 linear_01 -> 활성화 함수 -> linear_02 ->활성화 함수 -> linear_03 = output 으로 각 레이어를 지나가는 단계임은 인지가 되나, 왜 점차 features가 줄어드는가? 와 무엇을 학습하면서 layer를 지나가는가? 가 이해가 안됩니다. 결국 10개의 feature로 줄인다는것이 최초에는 28*28롤 784로 한 이미지의 pixel 갯수로 infeture로 받았으니 마지막에는 10개의 픽셀이 남는다는 것으로 이해되는데, 어떤 핵심(?) 또는 학습한 픽셀을 남기게 되는것인가? 가 궁금합니다.

처음으로 학습하여 '무엇을 모르는가?' 에 대한 확신이 없어 질문이 조금 난잡하나, 꼭 이해하고 싶어 질문드립니다.

추가로 제가 이해가 부족하다고 판단되는 부분이나 추가학습 부분 추천해주시면 감사하겠습니다.

감사합니다!

답변 1

0

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

안녕하십니까,

강의를 잘 듣고 계시다니, 저도 기분이 좋군요 ^^

  1. 네 맞습니다. train_data에서[0][0]과 [0][1]은 이미지와 labes로 이미 페어가 되어 있습니다. 그리고 show_images함수에서 class_names도 원래 약속되어있던 이름을 사람이 인지하기 좋게 이름만 매칭시켜 주었습니다. label의 0 값이 T-shirt/top, 1값이 Trouser 와 같이 매칭 됩니다.

     

2-1. SimpleLinearModel_01 클래스가 초기화를 통해서 linear_01 -> 활성화 함수 -> linear_02 ->활성화 함수 -> linear_03 = output 으로 각 레이어를 지나가는 단계임은 인지가 되나, 왜 점차 features가 줄어드는가?

=> feature의 갯수를 각 레이어 통과 시 마다 줄이지 않아도 됩니다. 근데 실습에 사용되는 모델의 경우에 일반적으로 레이어 통과 시 마다 out_features의 갯수를 줄입니다. 그렇지 않고 계속 out_features의 갯수를 늘리기 되면 학습 parameter의 수가 계속 늘어나게 됩니다. 그러니까 nn.Linear(in_features=200, out_features=100) 이라면 학습 weight parameter의 갯수는 200*100 이 됩니다. 만약에 out_features가 100이 아니라 1000 이라면 200 * 1000 이 되어서 불필요하게 커지며, 오히려 overfitting등의 문제가 생겨서 성능이 더 떨어질 수도 있습니다.

그리고 최종적으로 적용되는 nn.Linear 층의 out_features는 예측하려는 class의 갯수, 즉 예측 하려는 이미지 label 갯수인 10이 되어야 합니다. 왜냐하면 모델을 train 시킬 시, 실제 target label 갯수인 10과 동일하게 최종 출력이 10(batch_size, 10)이 되어야만 loss 함수에서 서로 값을 비교해서 loss값을 계산할 수 있기 때문입니다(즉 train loop에서 model의 출력값이 10가지로 나와야만 loss_fn(pred, labels)가 적용될 수 있습니다)

2.2 무엇을 학습하면서 layer를 지나가는가?

=> 이미지 데이터를 nn.Linear를 통과 시킬 때 마다 nn.Linear에서 가지는 학습 파라미터들은 이미지값의 패턴을 학습합니다. 하지만 공간적인 특성이 감안되지 않고 flatten 된 데이터로 이미지 값의 패턴을 학습하므로 학습 성능이 떨어지게 됩니다.

2.3 최초에는 28*28롤 784로 한 이미지의 pixel 갯수로 infeture로 받았으니 마지막에는 10개의 픽셀이 남는다는 것으로 이해되는데, 어떤 핵심(?) 또는 학습한 픽셀을 남기게 되는것인가? 가 궁금합니다.

=> 마지막에 10개의 픽셀이 남는건 아니고, 10개의 예측 logits 값을 만들게 됩니다. 아마 질문의 핵심중에 하나가 딥러닝이 무엇을 학습하고, 어떠한 방식으로 학습이 진행될 수 있느냐 일것도 같습니다만, 딥러닝 모델은 사실 매우 유연합니다. 너무 유연해서 너무나 다른 여러가지 방법으로 모델을 만들 수 있습니다. 하지만 뼈대는 학습 파라미터를 가진 레이어들을 서로 연결해서 모델을 만드는 것이고 이미지 판별과 같은 classification 모델의 경우 최종적으로 예측을 하는 레이어를 모델에 붙여서 모델의 예측 출력값과, 학습 데이터가 가지는 target값을 Loss 함수로 비교 적용하여 Gradient 값을 만든 뒤 학습 파라미터를 갱신하는 방법으로 구성되어 있습니다.

여기서 학습 파라미터를 가진 레이어는 지금 강의에서 듣고 계시는 nn.Linear가 될 수도 있고, 뒤에 CNN 에서 설명드리는 nn.Conv2d가 될 수도 있습니다. 중요한 건 이러한 레이어(즉 학습파라미터를 가진 객체)들을 효과적으로 잘 연결하고, 적절한 Loss를 적용해서 잘 학습 시키면 (신기하게도) 딥러닝 모델이 일반 머신러닝에서 하기 힘든 이미지 판별등의 작업을 잘 수행할 수 있다는 것입니다.

3. 추가로 제가 이해가 부족하다고 판단되는 부분이나 추가학습 부분 추천해주시면 감사하겠습니다.

=> 특별히 이해가 부족한 부분이 있다고 생각이 들지는 않는군요 ^^ 혹시나 잘 이해가 안되는 부분이 있으시면 언제든지 질문 주시고, 제가 앞에서 말씀드린 사항을 기억하시면서 이전 강의 내용들도 다시 한번 여유가 가지고 들어보시면 좋을 것 같습니다.

감사합니다.

 

황승현님의 프로필 이미지
황승현
질문자

친절하고 자세한 설명 너무 감사합니다!!

황승현님의 프로필 이미지
황승현

작성한 질문수

질문하기