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와 일치하는지 살펴보세요. (다르기 때문에 오류가 발생하는 것입니다. 좀 더 이해가 쉽도록 본문의 문장을 수정했습니다.)
정성태

... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11075정성태10/20/201621006Windows: 127. Convert-WindowsImage.ps1 사용 방법 정리
11074정성태10/20/201629316Windows: 126. Windows Server 2016 평가판을 정식 버전으로 라이선스 변경하는 방법
11073정성태10/20/201625361.NET Framework: 613. 윈도우 데스크톱 응용 프로그램(예: Console)에서 알림 메시지(Toast notifications) 띄우기 [1]파일 다운로드1
11072정성태10/20/201621886VC++: 102. 새로 추가한 ATL COM 객체가 regsvr32.exe로 등록이 안 되는 문제
11071정성태10/20/201625417.NET Framework: 612. UWP(유니버설 윈도우 플랫폼) 앱에서 콜백 함수 내에서의 UI 요소 접근 방법 [1]
11070정성태10/20/201619626Windows: 125. 윈도우 서버 2016 마이그레이션
11069정성태10/19/201627344.NET Framework: 611. C++ 개발자들을 위한 C# Thread 동작 방식 [2]
11068정성태10/19/201630539Windows: 124. 윈도우 운영체제의 시간 함수 (5) - TSC(Time Stamp Counter)와 QueryPerformanceCounter [12]파일 다운로드1
11067정성태10/18/201626860Windows: 123. 윈도우 운영체제의 시간 함수 (4) - RTC, TSC, PM Clock, HPET Timer [2]
11066정성태10/17/201624505Windows: 122. 윈도우 운영체제의 시간 함수 (3) - QueryInterruptTimePrecise, QueryInterruptTime 함수파일 다운로드1
11065정성태10/15/201629946Windows: 121. 윈도우 운영체제의 시간 함수 (2) - Sleep 함수의 동작 방식 [1]
11064정성태10/14/201621633.NET Framework: 610. C# - WaitOnAddress Win32 API 사용파일 다운로드1
11063정성태10/14/201637754Windows: 120. 윈도우 운영체제의 시간 함수 (1) - GetTickCount와 timeGetTime의 차이점 [5]파일 다운로드1
11062정성태10/12/201618369오류 유형: 361. WCF .svc 호출 시 Could not find a base address that matches scheme net.tcp 예외
11061정성태10/12/201630482오류 유형: 360. IIS - 500.19 오류 (0x80070021)
11060정성태10/12/201622950오류 유형: 359. WCF - .svc 요청시 404 Not Found
11059정성태10/11/201627222.NET Framework: 609. WPF - 다중 스레드 환경에서 데이터 바인딩의 INotifyPropertyChanged.PropertyChanged에 대한 배려 [1]파일 다운로드1
11058정성태10/8/201622539개발 환경 구성: 303. Windows 10 Bash Shell - 한글 환경을 영문으로 바꾸고 싶다면?
11057정성태10/8/201617936오류 유형: 358. Windows 10 bash shell - sudo: unable to resolve host ...
11056정성태10/8/201620794개발 환경 구성: 302. Windows 10 bash shell 시작 시 [...] packages can be updated.
11055정성태10/8/201621849.NET Framework: 608. double 값을 구할 때는 반드시 피연산자를 double로 형변환! [6]
11054정성태10/5/201625870개발 환경 구성: 301. "Let's Encrypt" SSL 인증서를 Azure Cloud Services(classic)에 업데이트하는 방법
11053정성태10/5/201620559.NET Framework: 607. C# try/catch/finally의 IL 코드 표현
11052정성태9/27/201634711개발 환경 구성: 300. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 [7]파일 다운로드1
11051정성태9/25/201621891개발 환경 구성: 299. docker - c:\programdata\docker\windowsfilter 폴더 정리하는 방법파일 다운로드1
11050정성태9/24/201626646VC++: 101. 반올림하지 않고 double 변수 값 출력하는 방법 [3]
... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...