안녕하세요. Go 언어 학습을 잠시 미루고 대학원 진학을 준비하며 머신러닝을 다시 공부하기 시작했습니다. 본 글은 학습 과정에서 발생한 다양한 오류와 그 해결 방법을 기록한 것입니다.
학습 자료
Andrew Ng 교수의 Machine Learning Specialization 강의 (한글/영문 자막 지원) 를 주 교재로 사용 중입니다.
오류 기록
1. 그래프 출력 오류 (해결 완료)
C1_W1_Lab04_Cost_function_Soln 예제를 Jupyter Notebook에서 실행할 때 발생한 오류입니다. 특히 %matplotlib widget을 사용한 대화형 그래프 생성 과정에서 문제가 나타났습니다.
오류 메시지 (요약):
AttributeError: module 'matplotlib.cbook' has no attribute '_Stack'
...
TypeError: Cannot read properties of null (reading 'state_change')
원인 분석:
최신 버전의 matplotlib과 ipympl (Jupyter용 대화형 매트랩랩 플러그인) 사이의 호환성 문제입니다. 최신 matplotlib에서 cbook._Stack 속성이 제거되었으나, 구버전 ipympl이 이를 참조하려 하기 때문입니다. 또한, jupyter-matplotlib의 프론트엔드 확장이 제대로 설치되지 않아 발생하는 추가 오류입니다.
해결 방법:
matplotlib을 호환되는 버전으로 다운그레이드합니다.- Jupyter Lab에서
ipympl프론트엔드 확장을 올바르게 설치합니다. - 설치 후 Jupyter Notebook/Lab을 재시작하는 것을 잊지 마십시오. (필수)
다음 명령어로 의존성을 재설치할 수 있습니다:
pip install matplotlib==3.6.3 ipympl==0.8.0
conda install -c conda-forge ipympl # Jupyter Lab 프론트엔드 확장 설치를 위해
이후 코드 셀 상단에 %matplotlib widget을 명시하여 그래프가 정상 출력되는 것을 확인했습니다.
2. 정수 오버플로우 (해결 완료)
C1_W1_Lab05_Gradient_Descent_Soln 실행 중 plt_divergence() 함수에서 OverflowError가 발생했습니다.
원인 분석:
np.zeros_like() 함수는 입력 배열과 동일한 데이터 타입(기본값 int)으로 배열을 생성합니다. compute_cost() 함수는 매우 큰 부동소수점 값을 반환하는데, 이를 정수형 배열에 할당하려 하면서 변환 과정에서 오버플로우가 발생했습니다.
해결 방법:
lab_utils_uni.py 파일 내 plt_divergence() 함수에서 배열 생성 시 데이터 타입을 float으로 명시합니다.
수정 전:
cost = np.zeros_like(w_array)
z = np.zeros_like(tmp_b)
수정 후:
cost = np.zeros_like(w_array, dtype=float)
z = np.zeros_like(tmp_b, dtype=float)
변경 후 정상 동작을 확인했습니다.
3. scikit-learn 버전 불일치 (해결 완료)
신경망 순전파 실습 과제에서 OneHotEncoder 사용 시 오류가 발생했습니다.
TypeError: OneHotEncoder.__init__() got an unexpected keyword argument 'sparse'
원인 분석:
최신 버전의 scikit-learn에서 OneHotEncoder의 sparse 매개변수가 sparse_output으로 변경되었습니다.
해결 방법:
코드 내 sparse를 sparse_output으로 변경합니다.
# 수정 전
encoder = OneHotEncoder(sparse=False)
# 수정 후
encoder = OneHotEncoder(sparse_output=False)
4. Windows 환경에서 Linux 전용 라이브러리 실행 오류 (해결 완료)
Lunar Lander 강화학습 환경을 설정하는 과정에서 pyvirtualdisplay 모듈을 사용할 때 오류가 발생했습니다.
원인 분석:
pyvirtualdisplay는 Xvfb와 같은 Linux 가상 디스플레이 서버에 의존합니다. Windows 운영체제에서는 이 기능을 지원하지 않으므로, 관련 코드가 실행될 수 없습니다.
해결 방법:
로컬 Windows 환경에는 이미 GUI가 존재하므로, 가상 디스플레이를 시작하는 코드를 주석 처리하거나 삭제합니다.
# from pyvirtualdisplay import Display
# Display(visible=0, size=(840, 480)).start()
이 두 줄을 제거한 후 나머지 코드를 정상 실행할 수 있었습니다.
5. box2d-py 패키지 빌드 실패 (해결 완료)
pip install gym[box2d] 명령어 실행 시 box2d-py C++ 확장을 빌드하는 과정에서 오류가 발생했습니다.
error: command 'swig.exe' failed: None
ERROR: Failed building wheel for box2d-py
원인 분석:
box2d-py는 SWIG (Simplified Wrapper and Interface Generator) 를 사용하여 C++ 코드를 Python 래퍼로 변환합니다. 시스템에 올바른 SWIG 실행 파일이 없거나, pip를 통해 설치된 SWIG에 문제가 있어 빌드가 실패했습니다.
해결 방법:
conda를 사용하여 SWIG를 먼저 설치한 후, 다시 gym[box2d] 패키지를 설치합니다.
conda install swig
pip install gym[box2d]
conda는 일반적으로 더 안정적인 바이너리 패키지를 제공하므로, 이 방법으로 문제가 해결되었습니다.