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)
13429정성태10/27/20232923닷넷: 2152. Win32 Interop - C/C++ DLL로부터 이중 포인터 버퍼를 C#으로 받는 예제파일 다운로드1
13428정성태10/25/20232976닷넷: 2151. C# 12 - ref readonly 매개변수
13427정성태10/18/20233155닷넷: 2150. C# 12 - 정적 문맥에서 인스턴스 멤버에 대한 nameof 접근 허용(Allow nameof to always access instance members from static context)
13426정성태10/13/20233324스크립트: 59. 파이썬 - 비동기 호출 함수(run_until_complete, run_in_executor, create_task, run_in_threadpool)
13425정성태10/11/20233140닷넷: 2149. C# - PLinq의 Partitioner<T>를 이용한 사용자 정의 분할파일 다운로드1
13423정성태10/6/20233117스크립트: 58. 파이썬 - async/await 기본 사용법
13422정성태10/5/20233269닷넷: 2148. C# - async 유무에 따른 awaitable 메서드의 병렬 및 예외 처리
13421정성태10/4/20233317닷넷: 2147. C# - 비동기 메서드의 async 예약어 유무에 따른 차이
13420정성태9/26/20235464스크립트: 57. 파이썬 - UnboundLocalError: cannot access local variable '...' where it is not associated with a value
13419정성태9/25/20233148스크립트: 56. 파이썬 - RuntimeError: dictionary changed size during iteration
13418정성태9/25/20233842닷넷: 2146. C# - ConcurrentDictionary 자료 구조의 동기화 방식
13417정성태9/19/20233398닷넷: 2145. C# - 제네릭의 형식 매개변수에 속한 (매개변수를 가진) 생성자를 호출하는 방법
13416정성태9/19/20233186오류 유형: 877. redis-py - MISCONF Redis is configured to save RDB snapshots, ...
13415정성태9/18/20233677닷넷: 2144. C# 12 - 컬렉션 식(Collection Expressions)
13414정성태9/16/20233447디버깅 기술: 193. Windbg - ThreadStatic 필드 값을 조사하는 방법
13413정성태9/14/20233642닷넷: 2143. C# - 시스템 Time Zone 변경 시 이벤트 알림을 받는 방법
13412정성태9/14/20236919닷넷: 2142. C# 12 - 인라인 배열(Inline Arrays) [1]
13411정성태9/12/20233416Windows: 252. 권한 상승 전/후 따로 관리되는 공유 네트워크 드라이브 정보
13410정성태9/11/20234931닷넷: 2141. C# 12 - Interceptor (컴파일 시에 메서드 호출 재작성) [1]
13409정성태9/8/20233790닷넷: 2140. C# - Win32 API를 이용한 모니터 전원 끄기
13408정성태9/5/20233765Windows: 251. 임의로 만든 EXE 파일을 포함한 ZIP 파일의 압축을 해제할 때 Windows Defender에 의해 삭제되는 경우
13407정성태9/4/20233516닷넷: 2139. C# - ParallelEnumerable을 이용한 IEnumerable에 대한 병렬 처리
13406정성태9/4/20233476VS.NET IDE: 186. Visual Studio Community 버전의 라이선스
13405정성태9/3/20233920닷넷: 2138. C# - async 메서드 호출 원칙
13404정성태8/29/20233430오류 유형: 876. Windows - 키보드의 등호(=, Equals sign) 키가 눌리지 않는 경우
13403정성태8/21/20233265오류 유형: 875. The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
1  2  3  4  5  6  7  [8]  9  10  11  12  13  14  15  ...