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

celestial_님의 프로필 이미지
celestial_

작성한 질문수

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

Dense Layer로 Fashion MNIST 예측 모델 구현하기 - 모델 설계 및 학습 수행

선생님, 질문이 있습니다.

해결된 질문

작성

·

314

0

선생님, 늘 강의 잘 듣고 있습니다.

 

1) 결론적으로 (None,784)로 표기되는 이유가 

프로그래머가 Batch_size를 어떻게 가져갈 지 모르기 때문에 None으로 표기하는 것일 뿐인가요?

2) 이게 맞다면, Input X는 만일 Batch_size가 32로 설정이 되어 있다면 세로 784, 가로 32가 되는 것이라고 이해를 해도 되는 것이죠?

저는 이 강의를 듣는 도중 (28,28)을 Flatten을 통해 784로 변환을 하면, 어 그럼 한 장(열벡터) 대해서만 Network를 통과시키는 것인가?라고 생각을 하고 있었는데,  강의가 20분이 띡 되는 순간 그게 아님을 깨달았습니다. 제가 제대로 이해하고 있는게 맞을까요?

 

제가 이해한 것이 맞다는 전제 하에, 

3) dot연산을 위하여 (Batch_size,784)에 대한 그 W[1](1층에서의 가중치 배열)사이즈가 (784,100)이 되는 것으로 이어질 수 있나요? 그래서 78400이 나오는 것이구요(bias제외)
4) 이게 표기가 약간 헷갈리는데 shape가 (세로의 길이,가로의 길이)가 아니라 (가로의 길이,세로의 길이)인 것인가요? 아뭔가 여기서 또 논리적으로 맞아떨어져야하니 혼동이 살짝 되는군요 ㅜㅜ

tmp = np.array([[1,2,3],[4,5,6]])
tmp.shape

하면 (2,3)이 나오는 것으로 보아 (row,col)의 통상적인 뜻으로 이해할 수 있는데

이게 흐름이 딱 들어맞으려면 (784,Batch_size)로 이해가 되어야할텐데 그렇게 되면 제가 여태 이해한 것과 양립할 수 없게 되는 결과로 이어져서 답답합니다. 오늘 잠을 못잘 것 같습니다ㅜ

5) tensorflow.keras.metrics 에는 Accuracy 말고도 F1_score나 그 재현율 정밀도 기반으로 만들어지는 다른 것들을 포함하고 있는 것이죠?

 

감사합니다ㅜㅜ!  

답변 3

1

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

안녕하십니까, 

 

모델 layer의 shape를 추상적으로 이해하기 위해서 batch size는 고려하지 않으시는게 이해에 도움이 된다고 말씀 드렸습니다만, 

일단, 모델 layer의 shape를 설계시에는 batch size를 넣어주지 않아도 됩니다. keras가 나중에 학습할 때 알아서 만들어 냅니다. 

즉 Sequential([Flatten(input_shape=(INPUT_SIZE, INPUT_SIZE)), Dense(100)) 이라고 하면

INPUT_SIZE가 28이면 28X28 행렬을 1차원으로 Flatten한 784개의 Feature를 가진 (추상적인)1차원 행렬을 만듭니다(즉 shape는 (784, )  그리고 Dense(100)이면 100개의 노드를 가진 (추상적인) 1차원 행렬을 가지게 됩니다(즉 shape는 (100, )) , 그리고 이미지 input 과 Dense(100) 사이의 weight의 shape는 (784, 100) 이 됩니다. 

그런데 여기에 실제로는 batch size만큼의 여러개의 image가 input으로 입력됩니다. 10장의 이미지를 한꺼번에 넣는다고 한다면 실제 학습 시에는 flatten 된 결과는 10개 이미지 x 784 feature 즉 (10, 784) 행렬이 됩니다.  그리고 Dense(100)은 실제로는 (10, 100) 이 됩니다.

그런데 여기서 중요한 것은 weight입니다. weight의 shape는 batch size에 영향을 받지 않습니다.  즉 아무리 많은 batch size를 가지더라도 weight의 shape는 여전히 (784, 100) 입니다. 그리고 (10, 784)의 이미지 배치 행렬과 (784, 100)의 weight dot 연산 결과로 만들어지는 Dense layer의 shape는 (10, 100) 이 됩니다.

weight는 이전 노드와 다음 노드의 갯수로 shape가 만들어지며 batch size에 영향 받지 않습니다(영향을 받아서도 안되고요 ^^;;) 딥러닝에서 중요한것은 이 weight를 구하는 것입니다. 

1) 결론적으로 (None,784)로 표기되는 이유가 

프로그래머가 Batch_size를 어떻게 가져갈 지 모르기 때문에 None으로 표기하는 것일 뿐인가요?

=> 네 맞습니다. 

2) 이게 맞다면, Input X는 만일 Batch_size가 32로 설정이 되어 있다면 세로 784, 가로 32가 되는 것이라고 이해를 해도 되는 것이죠?

=> 세로, 가로라는 표현은 잘 사용하지 않지만, 세로의 크기는 rows의 크기로, 가로의 크기는 columns의 크기로 간주하면 batch_size 32는 (32, 784) 이며 세로가 32, 가로가 784 입니다. 

저는 이 강의를 듣는 도중 (28,28)을 Flatten을 통해 784로 변환을 하면, 어 그럼 한 장(열벡터) 대해서만 Network를 통과시키는 것인가?라고 생각을 하고 있었는데,  강의가 20분이 띡 되는 순간 그게 아님을 깨달았습니다. 제가 제대로 이해하고 있는게 맞을까요?

=> 왜 딱 한장이 열벡터인지 잘 모르겠습니만 아마 지금 세로와 가로의 개념이 rows와 columns에 반대되게 이해한것으로 생각됩니다. 

3) dot연산을 위하여 (Batch_size,784)에 대한 그 W[1](1층에서의 가중치 배열)사이즈가 (784,100)이 되는 것으로 이어질 수 있나요? 그래서 78400이 나오는 것이구요(bias제외)

=> 네 맞습니다. 만약 W 가 아니라 W Transpose로 dot 연산하면 W의 Shape는 (100, 784) 입니다. 

4) 이게 표기가 약간 헷갈리는데 shape가 (세로의 길이,가로의 길이)가 아니라 (가로의 길이,세로의 길이)인 것인가요? 아뭔가 여기서 또 논리적으로 맞아떨어져야하니 혼동이 살짝 되는군요 ㅜㅜ

=> shape는 (rows, columns)이며 사각형에 비유하자면 (세로의 길이, 가로의 길이) 입니다. 

5) tensorflow.keras.metrics 에는 Accuracy 말고도 F1_score나 그 재현율 정밀도 기반으로 만들어지는 다른 것들을 포함하고 있는 것이죠?

=> 네 맞습니다. metrics에 다른 평가 지표도 가지고 있습니다. 

 

감사합니다. 

0

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

1) 강의 10:32 ~ 10:54부분에서 

사진 한 장을 세로로 쭉 표기를 하여 (784, )를 표현하셨는데 

만일 batch_size가 32라고 가정했을 때 

왜 갑자기 (32,784)로 바뀌는지 이해가 되지 않습니다. 

=> 음,  784개의 Feature 를 가지는 image가 32개이므로 (32, 784)가 됩니다. 그러니까 784개 짜리가 32개 있는 것입니다. 그래서 shape가 (32, 784) 입니다.

================================>

boston에서 예를 들면 X배열

                               RN         LSTAT  feature3, ------- feature 784

record 1              3                 3

record 2              2                 3

......

record 32            2                 5

(32,2) 가 있으면 레코드의 개수(batch_size)가 32개이고 feature의 개수가 784개인데, 

그러면 Input X 배열의 shape만 놓고 보았을 때 (32,784)가 되는 것이잖아요?

=> (32, 2)가 있다는게 어떤 의미인지는 모르겠습니다만, 레코드의 개수(batch_size)가 32개이고 feature의 개수가 784개이면 Input X 배열의 shape는 (32, 784) 입니다.

다시 한번 말씀드립니다만, batch size에 대한 차원은 네트웍 설명시에 그림으로 표시하지 않는 경우가 대부분입니다.  batch size는 동적으로 변경될 수 있기 때문입니다. 따라서 그림에서 표시된 차원보다 배치 차원을 포함한 1차원이 추가되는게 실제 입력입니다. 하지만 이건 배치를 감안한 것이고 일반적으로 흑백 이미지는 2차원입니다. 그리고 그걸 flatten하면 1차원입니다.

이걸 배치를 포함해서 흑백 이미지가 3차원이고, flatten하면 2차원이다고 표현하게 되면, 일반적인 이미지 처리 지식이 있는 분이면 더 헷갈리게 됩니다. 그래서 flatten한 결과 shape를 (784, )로 표현합니다. 

=================================

input이 의미하는게, 그러니까 사진 한장(28x28)에 대한 (784, )의 단일 결과 수치가 아니라

input X배열을 세로 한 줄 씩 총 784개 의 feauture vector를 의미하는 것인가요?
(여기서 말하는 feature vector란 boston에서 32개의 모든 레코드에서 RN을 세로로 쭉 합해놓은 열벡터를 의미합니다.)

=> 28x28 2차원 형태로 되어 있는 pixel값을 flatten하여 784개의 1차원 형태의 pixel 값으로 만든 것입니다. 

2) 그 다음 W의 shape에 대한 질문입니다.

노드의 개수가 100인 어떤 Layer를 통과하는데요,

일단 여기서의 가중치 배열 W의 shape는 (100,784)이면

통상적으로 가중치 배열을 곱하고자 W.T해주는 것이죠?

그래서 W.T.shape가 (784,100)이 되는 것이구요

(Coursera강의에서도 Transpose를 나중에는 그냥 받아들이겠거니 해서 생략을 하고
(어제 제가 질문드릴 때 W가 W 자체인지 W.T인지 헷갈리게 글을 써둔 것 같아서 재확인 받고자 합니다.)

=> 네 맞습니다. 

이게 맞다면, 

원래 input 배열 X.shape는 (32,784)이고 1층의 가중치 배열 W의 W.T.shape는 (784,100)이 되니까

summary() 결과 (None,100)이 나오게 되는 것이군요!

 => 네 맞습니다. 정확히는 W를 통과한 Output 결과가  (32, 100)이 됩니다.  

이런 방식이면 다른 층에 대해서도 계속 똑같은 방식으로 일반화해서 이해를 해도 될까요?????????

=> 네 맞습니다. 

 

 

 

0

celestial_님의 프로필 이미지
celestial_
질문자

선생님, 우선 주말인데도 답변해주셔서 감사합니다.

이에 추가적으로 질문을 드리고 싶습니다.

 

일단 Flatten함수의 기능은 이해를 하였으니 괜찮습니다. 

shape가 (row,column)인 것도 잘 이해하였습니다.

 

1) 강의 10:32 ~ 10:54부분에서 

사진 한 장을 세로로 쭉 표기를 하여 (784, )를 표현하셨는데 

만일 batch_size가 32라고 가정했을 때 

왜 갑자기 (32,784)로 바뀌는지 이해가 되지 않습니다. 

그래서 선생님 답변을 토대로 손으로 제가 직접 신경망 그리면서 이해한 바는 다음과 같은데

맞는지 한번 봐주시면 감사합니다ㅜ.ㅜ 

boston에서 예를 들면 X배열

                               RN         LSTAT  feature3, ------- feature 784

record 1              3                 3

record 2              2                 3

......

record 32            2                 5

(32,2) 가 있으면 레코드의 개수(batch_size)가 32개이고 feature의 개수가 784개인데, 

그러면 Input X 배열의 shape만 놓고 보았을 때 (32,784)가 되는 것이잖아요?

(C based 수도 코드로 표기한다면 X[32][784]이렇게)

 

그런데 신경망에서 통과를 할 때에는 

그 신경망 그림에서 x1,x2,x3 등등 이것들이 의미하는게 

x1 : X[1][1] - X[32][1] 

x2 : X[1][2] - X[32][2]

x3 : X[1][3] - X[32][3]

...

x784 : X[1][784] - X[32][784]

 

제가 앞서서 어 그러면 Input X배열의 shape은 (32,784)이니까 

summary()함수를 써보면 (None,784)가 나오는 게 이제서야 비로소 이해가 되는데,

저 (784, ) 라고 대체 왜 표기가 될까가 이해가 되지 않았습니다. 

그런데 혹시 강의 10:54에서 저렇게 세로로 쭉 표기하신

input이 의미하는게, 그러니까 사진 한장(28x28)에 대한 (784, )의 단일 결과 수치가 아니라

input X배열을 세로 한 줄 씩 총 784개 의 feauture vector를 의미하는 것인가요?
(여기서 말하는 feature vector란 boston에서 32개의 모든 레코드에서 RN을 세로로 쭉 합해놓은 열벡터를 의미합니다.)

2) 그 다음 W의 shape에 대한 질문입니다.

노드의 개수가 100인 어떤 Layer를 통과하는데요,

일단 여기서의 가중치 배열 W의 shape는 (100,784)이면

통상적으로 가중치 배열을 곱하고자 W.T해주는 것이죠?

그래서 W.T.shape가 (784,100)이 되는 것이구요

(Coursera강의에서도 Transpose를 나중에는 그냥 받아들이겠거니 해서 생략을 하고
(어제 제가 질문드릴 때 W가 W 자체인지 W.T인지 헷갈리게 글을 써둔 것 같아서 재확인 받고자 합니다.)

이게 맞다면, 

원래 input 배열 X.shape는 (32,784)이고 1층의 가중치 배열 W의 W.T.shape는 (784,100)이 되니까

summary() 결과 (None,100)이 나오게 되는 것이군요!

 

이런 방식이면 다른 층에 대해서도 계속 똑같은 방식으로 일반화해서 이해를 해도 될까요?????????

감사합니다! 

 

celestial_님의 프로필 이미지
celestial_

작성한 질문수

질문하기