ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • tensorflow.keras 에러 해결법
    AI, DataScience 2024. 11. 6. 18:00
    728x90

    선 요약

    윈도우 네이티브 환경이라면? 버전 호환성에 문제가 많다!

    Python 3.9

    tensorflow 2.10

    numpy<2

    scipy<1.12

    을 맞추어 환경을 세팅하자

     

    그냥 리눅스 쓰자

     

     

    윈도우에서 텐서플로우 쓰기

    대학원 딥러닝 강의에서 과제가 주어졌다. 과제는 간단하다. cat-dog 데이터셋으로 간단한 classifire 만드는 것. 그동안 한 짬이 있는데 이정도는 금방하지!

    최근에 컴퓨터를 우분투도 정리하기도 했고, 윈도우 끄기도 귀찮기도 하고, WSL까지 쓸 것도 없고, 윈도우에서 간단하게 코드 몇 줄만 쓰면 될 것 같았다. 그러지 말았어야 했는데...

     

    작성한 코드는 다음과 같다

    import tensorflow as tf
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    
    
    # ImageDataGenerator 생성
    train_datagen = ImageDataGenerator(
        rescale=1./255,        # 이미지의 픽셀 값을 0과 1사이로 스케일링
        rotation_range=40,     # 이미지 회전 범위
        width_shift_range=0.2, # 가로 이동 범위
        height_shift_range=0.2, # 세로 이동 범위
        shear_range=0.2,       # 전단 변환 범위
        zoom_range=0.2,        # 확대 축소 범위
        horizontal_flip=True,  # 수평 반전
        fill_mode='nearest'    # 이미지를 회전, 이동, 축소 또는 확대할 때 생기는 공간을 채우는 방식
    )
    
    test_datagen = ImageDataGenerator(rescale=1./255) # 테스트 데이터는 증강하지 않고 스케일링만
    
    # 데이터 로드
    train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(150, 150), # 모든 이미지의 크기를 150x150으로 조정
        batch_size=32,
        class_mode='binary'    # 이진 분류를 위한 클래스 모드
    )
    
    validation_generator = test_datagen.flow_from_directory( # validation 데이터도 증강하지 않음
        validation_dir,
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary'
    )
    
    test_generator = test_datagen.flow_from_directory(
        test_dir,
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary'
    )
    
    from tensorflow.keras import layers, models
    
    # CNN 모델
    model = models.Sequential([
        layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
        layers.MaxPooling2D((2, 2)),
        layers.Conv2D(64, (3, 3), activation='relu'),
        layers.MaxPooling2D((2, 2)),
        layers.Conv2D(128, (3, 3), activation='relu'),
        layers.MaxPooling2D((2, 2)),
        layers.Flatten(),
        layers.Dense(512, activation='relu'),
        layers.Dense(1, activation='sigmoid')
    ])
    
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    
    # 모델 학습
    model.fit(
        train_generator,
        steps_per_epoch=train_generator.samples // train_generator.batch_size,
        epochs=10,
        validation_data=validation_generator,
        validation_steps=validation_generator.samples // validation_generator.batch_size
    )
    
    # Evaluate the model on the test dataset
    test_loss, test_accuracy = model.evaluate(test_generator, steps=test_generator.samples // test_generator.batch_size)
    print(f"Test accuracy: {test_accuracy:.2f}")

     

     

    실수의 연속

    아 이런 실수를...! 디렉토리 경로에 한글과 띄어쓰기가 있어 텐서플로우가 설치되지 않는 게 아닌가?

    귀찮아서 "딥러닝 과제"라는 폴더에서 바로 코드를 짰더니 이런 일이 생겼다. 이런 기열찐빠를 내다니.. 즉시 작업하는 곳을 옮겼다.

    ---------------------------------------------------------------------------
    ModuleNotFoundError                       Traceback (most recent call last)
    ~\AppData\Local\Temp\ipykernel_47368\354244784.py in <module>
          1 import tensorflow as tf
    ----> 2 from tensorflow.keras.preprocessing.image import ImageDataGenerator
    
    ModuleNotFoundError: No module named 'tensorflow.keras'

    그러나 이번에는 이런 에러가 발생했다. 오랜만에 텐서플로우를 써서 실수가 있었나?

     

    알고보니...!  python 3.12 버전과 tensorflow에 호환성 이슈가 있다는 게 아닌가?

    그래서 conda 가상환경을 새로 만들었다. 넉넉하게 3.7로 다시 만들었다.

     

    그런데 이제는 기존에 되던것도 안 되는 게 아닌가?

    파이썬 커널을 재시작해보고 텐서플로우를 지웠다가 깔았다가, 가상환경을 새로 만들었다가...

     

    혹시나 해서 텐서플로우와 파이썬 버전의 호환성을 찾아보니 3.9 이상 3.12 이하로 해야하는게 아닌가?

    그래서 파이썬을 3.9로 해서 다시 가상환경을 만들었다.

     

    그런데도 같은 문제가 발생하는 것이 아닌가?

    그래서 텐서플로우의 버전을 확인해보았다. 최신버전으로 잘 설치했을텐데?

     

    아뿔싸...! 윈도우 네이티브에서는 2.10까지만 지원하는 게 아니었는가? WSL과 PyTorch만 써서 따라가지 못했다. 사실 이때 그냥 WSL로 넘어가면 됐지만, 이 문제를 해결하는데 들인 시간이 벌써 3시간... 물론 중간중간에 밥도 먹고 농땡이도 쳤지만, 이왕 한 김에 끝까지 해야겠다는 생각이 들었다.

     

    그래서 텐서플로우를 다운그레이드했다.

     

    그랬더니...! 이번에는 Numpy가 문제이지 않은가...! 텐서플로우 이 버전에서는 넘파이 2가 호환이 되지 않는다나 뭐라나...

     pip install "numpy<2"

    그래서 넘파이를 지우고 다운그레이드 했다.

     

    그런데 이번에는..... scipy가 없는 게 아닌가?

    그래서 scipy 공식 문서를 보고 넘파이 1.26 버전과 파이썬 3.9에 맞는 1.11 버전을 설치했다.

     

    안 해도 될 뻘짓을 한 후 결국에는 해결

     

    결론

    리눅스 쓰자

    연구실에서 게임하지 말자

    728x90

    댓글

안녕하세요? 반가워요. 광고 눌러주세요?