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

1  2  3  4  5  6  7  8  9  10  [11]  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13667정성태7/7/20246625닷넷: 2273. C# - 리눅스 환경에서의 Hyper-V Socket 연동 (AF_VSOCK)파일 다운로드1
13666정성태7/7/20247714Linux: 74. C++ - Vsock 예제 (Hyper-V Socket 연동)파일 다운로드1
13665정성태7/6/20247893Linux: 73. Linux 측의 socat을 이용한 Hyper-V 호스트와의 vsock 테스트파일 다운로드1
13663정성태7/5/20247502닷넷: 2272. C# - Hyper-V Socket 통신(AF_HYPERV, AF_VSOCK)의 VMID Wildcards 유형파일 다운로드1
13662정성태7/4/20247499닷넷: 2271. C# - WSL 2 VM의 VM ID를 알아내는 방법 - Host Compute System API파일 다운로드1
13661정성태7/3/20247425Linux: 72. g++ - 다른 버전의 GLIBC로 소스코드 빌드
13660정성태7/3/20247538오류 유형: 912. Visual C++ - Linux 프로젝트 빌드 오류
13659정성태7/1/20247875개발 환경 구성: 715. Windows - WSL 2 환경의 Docker Desktop 네트워크
13658정성태6/28/20248264개발 환경 구성: 714. WSL 2 인스턴스와 호스트 측의 Hyper-V에 운영 중인 VM과 네트워크 연결을 하는 방법 - 두 번째 이야기
13657정성태6/27/20247925닷넷: 2270. C# - Hyper-V Socket 통신(AF_HYPERV, AF_VSOCK)을 위한 EndPoint 사용자 정의
13656정성태6/27/20248109Windows: 264. WSL 2 VM의 swap 파일 위치
13655정성태6/24/20247875닷넷: 2269. C# - Win32 Resource 포맷 해석파일 다운로드1
13654정성태6/24/20247796오류 유형: 911. shutdown - The entered computer name is not valid or remote shutdown is not supported on the target computer.
13653정성태6/22/20247939닷넷: 2268. C# 코드에서 MAKEINTREOURCE 매크로 처리
13652정성태6/21/20249259닷넷: 2267. C# - Linux 환경에서 (Reflection 없이) DLL AssemblyFileVersion 구하는 방법파일 다운로드2
13651정성태6/19/20248498닷넷: 2266. C# - (Reflection 없이) DLL AssemblyFileVersion 구하는 방법파일 다운로드1
13650정성태6/18/20248421개발 환경 구성: 713. "WSL --debug-shell"로 살펴보는 WSL 2 VM의 리눅스 환경
13649정성태6/18/20247978오류 유형: 910. windbg - !py 확장 명령어 실행 시 "failed to find python interpreter" (2)
13648정성태6/17/20248304오류 유형: 909. C# - DynamicMethod 사용 시 System.TypeAccessException
13647정성태6/16/20249348개발 환경 구성: 712. Windows - WSL 2의 네트워크 통신 방법 - 세 번째 이야기 (같은 IP를 공유하는 WSL 2 인스턴스) [1]
13646정성태6/14/20247779오류 유형: 908. Process Explorer - "Error configuring dump resources: The system cannot find the file specified."
13645정성태6/13/20248208개발 환경 구성: 711. Visual Studio로 개발 시 기본 등록하는 dev tag 이미지로 Docker Desktop k8s에서 실행하는 방법
13644정성태6/12/20248870닷넷: 2265. C# - System.Text.Json의 기본적인 (한글 등에서의) escape 처리 [1]
13643정성태6/12/20248334오류 유형: 907. MySqlConnector 사용 시 System.IO.FileLoadException 오류
13642정성태6/11/20248220스크립트: 65. 파이썬 - asgi 버전(2, 3)에 따라 달라지는 uvicorn 호스팅
13641정성태6/11/20248684Linux: 71. Ubuntu 20.04를 22.04로 업데이트
1  2  3  4  5  6  7  8  9  10  [11]  12  13  14  15  ...