Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

파이썬 tensorflow - ValueError: Shapes (...) and (...) are incompatible

모델 학습을 실행했는데,

...[생략]...
model.add(Dense(units=256, input_dim=784, activation='relu'))
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=10, activation='softmax'))

hist = model.fit(X_train, Y_train, epochs=1, batch_size=50, validation_data=(X_val, Y_val))

ValueError가 발생한다면?

raise ValueError("Shapes %s and %s are incompatible" % (self, other))

상황에 따라 다를 수 있지만, 제가 겪은 상황에서의 self와 other의 의미는 각각 다음과 같습니다.

self == (batch_size, 요소의 dim)
other == (batch_size, 출력 층의 units)

사실 대개의 경우 이 오류는 model.fit에 전달한 X_train, Y_train과 validation_data에 전달한 값들의 차원이 신경망의 units와 맞지 않기 때문에 발생합니다.

예를 들어, validation_data에 전달할 Y_val에 대해 요구되는 차원이 "Y_val: (데이터 수, 10)"인데, 실수로 Y_val: "(데이터 수, 28, 28, 10)"라는 식의 값을 전달하게 되면, model.fit에서 X_train, Y_train에 대한 1차 학습은 끝났다는 식의 메시지와 함께,

 993/1000 [============================>.] - ETA: 0s - loss: 0.2695 - accuracy: 0.9186

이어서 validation_data를 검증하려고 수행되는 시점에 다음과 같은 식의 Traceback 오류가 발생합니다.

...[생략]...
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (50, 28, 28, 10) and (50, 10) are incompatible

언급했듯이, 이것은 다음과 같이 해석될 수 있고,

Shapes (batch_size, 요소의 dim) and (batch_size, 출력 층의 units) are incompatible

따라서 정황으로 보아 model.fit의 validation_data에 전달한 데이터 중에 (데이터 수, 28, 28, 10)에 해당하는 값이 있으며 이것은 출력 Dense(batch_size, 10개의 출력)에 맞지 않으므로 오류가 발생했음을 짐작게 합니다. 실제로 validate_data에 전달한 값의 차원을 살펴보면,

print("X_val:", X_val.shape)  # X_val: (10000, 784)
print("Y_val:", Y_val.shape)  # Y_val: (10000, 28, 28, 10)

오류 메시지에서 나왔던 "(크기, 28, 28, 10)"과 동일하게 겹쳐 있는 Y_val의 데이터가 정확하지 않음을 알 수 있습니다. 사실, "(50, 10)"이라는 출력에서 "10"이 마지막 Dense(출력 층)의 units에 해당하기 때문에 이런 경우 X_val을 살펴볼 필요 없이 Y_val 값만 조사하면 됩니다.




한 가지 더 볼까요? ^^

model.add(Dense(units=5, activation='softmax'))

hist = model.fit(X_train, Y_train, epochs=1, batch_size=50, validation_data=(X_val, Y_val))

위와 같이 실행했는데 다음과 같은 오류가 발생한다면?

...[생략]...
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (50, 10) and (50, 5) are incompatible

게다가 이번엔 "993/1000 [============================>.] - ETA: 0s - loss: 0.2695 - accuracy: 0.9186"라는 식의 메시지도 전혀 없었습니다. 그렇다면, 이번엔 model.fit에 전달된 데이터 중 아직 validation_data를 검증하는 단계까지 가기도 전에 X_train, Y_train부터 맞지 않은 데이터가 전달된 것입니다.

따라서, 이렇게 해석해 볼 수 있고,

Shapes (batch_size, 요소의 dim) and (batch_size, 출력 층의 units) are incompatible

따라서 위의 예제에서는 마지막 Dense의 units가 5인데, 입력으로 전달된 데이터의 차원이 출력과 맞지 않은 것이므로 X_train이 아닌 Y_train의 데이터가 잘못된 경우라고 판정할 수 있습니다. 실제로 이에 대해 shape을 검사해 보면,

print("Y_train:", Y_train.shape)  # (데이터 크기, 10)

전달된 Y_train의 차원이 10으로 나오는데 Dense에는 5라고 지정했기 때문에 불일치가 발생한 것입니다. 만약 Dense에 지정한 units가 맞는 값이라면, 저 코드의 출력값(Y_train.shape)은 5가 나와야 했습니다. 혹은 반대로 데이터가 맞는 경우라면, 마지막 Dense의 출력을 잘못 지정한 것이므로 Dense의 units 값을 "model.add(Dense(units=10, activation='softmax'))"로 바꿔야 합니다.

이 정도면, 향후 ValueError가 발생했을 때 어떤 데이터가 잘못된 것인지 판단할 수 있을 것입니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/30/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2021-11-30 04시33분
[1234] 안녕하세용
"마지막 요소가 (10이 아닌) 5가 나와야 했던 것입니다."
해당 경우에 해결 방법이 궁금합니다!
[guest]
2021-11-30 04시41분
글에 답이 있습니다. 해당 연산을 수행하는 X_train, Y_train, validation_data의 차원 수가 Dense에 지정한 units와 맞지 않기 때문입니다. 만약, 전달한 데이터가 올바른 값이라면 Dense의 units를 그에 맞게 변경해야 하고, 그 반대라면 Dense의 units에 맞는 데이터를 전달해야 합니다.

본문에서 언급한 것처럼, 각 데이터의 shape 값을 조사해보고 그것이 Dense의 units와 일치하는지 살펴보세요. (다르기 때문에 오류가 발생하는 것입니다. 좀 더 이해가 쉽도록 본문의 문장을 수정했습니다.)
정성태

... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1100정성태8/17/201128915.NET Framework: 236. SqlDbType - DateTime, DateTime2, DateTimeOffset의 차이점파일 다운로드1
1099정성태8/15/201128343오류 유형: 132. 어느 순간 갑자기 접속이 안 되는 TFS 서버
1098정성태8/15/201150357웹: 24. 네이버는 어떻게 로그인 처리를 할까요? [2]
1097정성태8/15/201121655.NET Framework: 235. 메서드의 메타 데이터 토큰 값으로 클래스를 찾아내는 방법
1096정성태8/15/201125794디버깅 기술: 42. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 - (2)
1095정성태8/14/201126231디버깅 기술: 41. Windbg - 비정상 종료된 닷넷 프로그램의 StackTrace에서 보이는 offset 값 의미
1094정성태8/14/201130612오류 유형: 131. Fiddler가 강제 종료된 경우, 웹 사이트 방문이 안되는 현상
1093정성태7/27/201124236오류 유형: 130. Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor ... Access is denied.
1092정성태7/22/201126637Team Foundation Server: 46. 코드 이외의 파일에 대해 소스 제어에서 제외시키는 방법
1091정성태7/21/201125677개발 환경 구성: 128. WP7 Emulator 실행 시 audiodg.exe의 CPU 소모율 증가 [2]
1089정성태7/18/201131257.NET Framework: 234. 왜? Button 컨트롤에는 MouseDown/MouseUp 이벤트가 발생하지 않을까요?파일 다운로드1
1088정성태7/16/201124318.NET Framework: 233. Entity Framework 4.1 - 윈도우 폰 7에서의 CodeFirst 순환 참조 문제파일 다운로드1
1087정성태7/15/201127023.NET Framework: 232. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 - 두 번째 이야기파일 다운로드1
1086정성태7/14/201128450.NET Framework: 231. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 [1]파일 다운로드1
1085정성태7/14/201128893.NET Framework: 230. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류 - 두 번째 이야기파일 다운로드1
1084정성태7/11/201134177.NET Framework: 229. SQL 서버 - DB 테이블의 데이터 변경에 대한 알림 처리 [4]파일 다운로드1
1083정성태7/11/201128221.NET Framework: 228. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류
1082정성태7/10/201127790.NET Framework: 227. basicHttpBinding + 사용자 정의 인증 구현 [2]파일 다운로드1
1081정성태7/9/201127111VC++: 53. Windows 7에서 gcc.exe 실행 시 Access denied 오류 [2]
1080정성태7/8/201125607웹: 23. Sysnet 웹 사이트의 HTML5 변환 기록 - 두 번째 이야기파일 다운로드1
1079정성태7/6/201130025오류 유형: 129. Hyper-V + Realtek 랜카드가 설치된 시스템의 BSOD 현상 [2]
1078정성태7/5/201137547VC++: 52. Chromium 컴파일하는 방법 [2]
1077정성태6/24/201135181.NET Framework: 226. HttpWebRequest 타입의 HaveResponse 속성 이야기파일 다운로드1
1076정성태6/23/201129321오류 유형: 128. SQL Express - User Instance 옵션을 사용한 경우 발생하는 오류 메시지 유형 2가지
1075정성태6/21/201124939VS.NET IDE: 69. 윈폰 프로젝트에서 WCF 서비스 참조할 때 Reference.cs 파일이 비어있는 경우
1074정성태6/20/201125029.NET Framework: 225. 닷넷 네트워크 라이브러리의 트레이스 기능파일 다운로드1
... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...