세로형
Link
10-24 07:24
«   2021/10   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
Archives
Today
189
Total
1,884,117
관리 메뉴

꿈 많은 사람의 이야기

파이썬 케라스(keras)로 딥러닝하자! CNN을 이용해 이미지 분류하기(image classification) 본문

deep learning(딥러닝)

파이썬 케라스(keras)로 딥러닝하자! CNN을 이용해 이미지 분류하기(image classification)

오키여 이수진의 블로그 2018. 6. 29. 17:49

 

해당 코드는 https://github.com/lsjsj92

에 있습니다. 참고하시고 스타도 주시면 감사하겠습니다 :)

 

파이썬으로 케라스(keras)와 사이킷런(scikit-learn)을 독학한지 어느덧 1달이 조금 넘었습니다.

그 동안 카테고리 분류도 해보고, 감정 분석도 해보고(실패....) 여러가지 해보면서

일반적인 머신러닝 알고리즘(서포트 벡터 머신(SVM), 랜덤 포레스트(random forest) 등)이 아닌 케라스로 다층 퍼셉트론(MLP)을 구현해서 

해봤습니다.

 

뭐 아직 다음 단계로 넘어갈 실력은 아니었지만 일단은 여러가지 경험을 쌓고자 이젠 컨볼루션 뉴런 네트워크(convolutional neural networks)를 해보려고 합니다.

컨볼루션 신경망이라고도 불리는데요

케라스에선 컨볼루션 신경망 레이어가 있습니다!(Conv2D)

 

이것을 이용해 이미지를 인식해보려고 합니다.

컨볼루션은 특히 영상 처리에 특화되어 있어서 영상처리쪽에서 많이 쓰인다고 합니다

 

제가 한 것은

비행기, 불상, 나비, 게 

이렇게 4가지 카테고리를 분류하는 작업을 진행했습니다.

 

 

디렉토리는 위와 같이 되어 있습니다.

test와 train 디렉토리가 있구요 

그 안에 세부적으로

 

 

이렇게 되어 있습니다.

비행기, 불상, 나비, 게

이 순으로 디렉토리가 있네요

 

 

 

각 이미지는 대략 200개? 정도 있었습니다.

비행기 같은 경우엔 500개가 넘었네요

어떤건 300개 이러구요

 

근데 아무래도 데이터 셋이 조금 부족합니다.

예제로 많이 쓰는 MNIST는 6만개 이러는데..

고작 몇백개니까요!

그래서 데이터를 부풀려보려고 합니다

 

 

 

케라스에 있는 ImageDataGenerator를 통해서 이미지를 생성을 할 예정인데요

각도를 바꾸고, 옆으로 조금 이동시키고 뭐 이런식으로 하면서 이미지를 더 생성할 예정입니다.

그리고 파일을 바로 생성해서 저자하도록 save_to_dir을 통해서 저장 경로를 지정했구요

1개 사진마다 10개씩 더 추가하려고 합니다~

 

 

이렇게 각도가 바뀌고, 옆으로 이미지가 좀 움직이는 등으로 이미지를 더 생성했습니다

각 사진 하나당 10개씩 추가되었어요

데이터 셋이 천 단위로 넘어가게 되었습니다~

 

이제 다음은 이미지와 카테고리를 X, Y 값으로 나눠야 합니다.

그래야 케라스에서 학습을 진행하니까요

 

반응형

이미지 크기는 64 x 64로 진행합니다.

카테고리별로 돌면서 label을 먼저 0으로 전부 초기화 한 다음

첫번째 idx에 1을 놓아줍니다.

그러면 맨 처음인 비행기는 [1 0 0 0]이 될 것이구요(라벨이 4개라서 배열 크기도 4개입니다)

두번재 불상은 [0 1 0 0]의 형태를 가지고 있을 겁니다.

그리고 이미지를 RGB값으로 바꿔주면서 resize하고 그 값을 numpy 라이브러리를 이용해 가지고와 저장합니다.

 

 

이렇게 저장됩니다~

이제 훈련을 시켜야겠죠!

 

 

카테고리는 마찬가지로 4개, 그림 크기는 64 x 64입니다.

아까 저장한 npy 파일을 가지고와서 저장합니다.

이제 CNN 컨볼루션 신경망 모델을 만들어보죠

 

Conv2D를 이용해서 만들 수 있는데요

 

 

3 x 3 크기의 컨볼루션 레이어를 32개의 필터수를 처음에 생성합니다. 활성화 함수는 relu를 사용하구요

input_shape는 64 x 64 크기와 컬러 값이니 3

즉 (64, 64, 3)의 튜플 값을 가지게 됩니다.

그리고 maxpooling2D를 통해서 주요 값만 뽑아내어 작은 출력 값을 만들어 냅니다.

즉 사소한 변화를 무시하는 것이죠.

 

그리고 Flatten()은 CNN에서 컨볼루션 레이어나 맥스풀링을 거치면 주요 특징만 추출되고 전결합층에 전달되어 학습됩니다.

이때, 컨볼루션이나 맥스풀링은 2차원을 주로 다루는데요. 전결합층에 전달을 하기 위해서는 1차원으로 바꿔줘야합니다.

이때 Flatten()을 사용하는 것이죠!

그리고 loss 함수로 binary_crossentropy를 사용했는데요

왜 softmax인데 이걸 사용하는지 저도 의문이었습니다.

이 글 뒷 부분엔 categorycial을 사용합니다.

(결론부터 말하면 binary_crossentropy 이런 상황에서 사용하면 안좋다고 말합니다

조언 해주신 인스페이스 김태영 이사님 감사드립니다)

 

 

 

이렇게 훈련을 진행합니다~

 

 

callback 함수로 인해 modelcheckpoint와 earlystoppin을 진행합니다.

케라스에선 이게 정말 좋더군요

 

300x250

계속 val_loss가 떨어지는 것을 볼 수 있습니다.

 

 

그 결과 94%의 정확도가 나왔네요

 

 

val_acc와 val_loss값도 안정적이구요

이제 테스트를 해봐야죠!

샘플 이미지를 미리 빼놨습니다.

 

 

 

이 이미지들을 기준으로 테스트 해보면요!

 

 

이렇게 나옵니다.

그리고 실패한 이미지들은 img_missing디렉토리로 빠지도록 저장했습니다.

 

 

얘가 실패했네요

 

자 이제 위에선 loss를 binary_crossentropy로 했는데요

이제 정석대로 categorical_crossentropy로 해보죠!

 

 

이렇게 바꿔주고요 진행해봅니다

 

 

음 뭔가 그래프가 아까보단 안이쁘지만..

그래도 정확도는 90%가 나왔네요

 

이제 새로운 샘플로 테스트를 해볼까요?

 

 

구글에서 새로운 사진들을 가지고 왔습니다~

얘내를 가지고 테스트를 해보면요!

 

 

 

음 비행기를 잘 못맞추네요~

그래도 불상, 게, 나비는 다 맞추는군요 ㅎㅎ

 

이렇게 파이썬 케라스(keras)를 통해서 CNN 컨볼루션 레이어를 구축해서 이미지를 분류할 수 있습니다~

독학하기 참 힘드네요 ㅠ

반응형
그리드형
197 Comments
  • 이전 댓글 더보기
  • 프로필사진 글 잘읽었습니다~ 2020.06.28 17:52 안녕하세요! 소중한 소스 올려주셔서 진심으로 감사드립니다.
    개발자님의 소스대로 코딩을 했습니다. 그런데 처음부터 막히내요ㅠㅠ 머신러닝은 처음이라 그냥 따라해보는중인데 여러가지로 많이 부족합니다.. 그래서 여쭙습니다!
    import os, re, glob
    import cv2
    import numpy as np
    from sklearn.model_selection import train_test_split

    caltech_dir = "../Users/USER20/tomato"
    categories = ["greentomato", "redtomato"]
    nb_classes = len(categories)

    imge_w = 64
    image_h = 64
    pixels = image_h * image_w * 3

    X = []
    Y = []

    for idx, cat in enumerate(categories):
    label = [0 for i in range(nb_classes)]
    label[idx] = 1
    image_dir = caltech_dir + "/" + cat
    files = glob.glob(image_dir + "/*.jpg")

    for i, f in enumerate(files):
    img = image.open(f)
    img = img.convert("RGB")
    img = img.resize((image_w, image_h))
    data = np.asarray(img)

    X.append(data)
    Y.append(label)
    np.save("./image_data.npy",X,Y)

    이렇게 저장하고,

    categories = ["greentomato", "redtomato"]
    nb_classes = len(categories)
    image_w = 64
    image_h = 64

    X_train, X_test, Y_train, Y_test = np.load("./image_data.npy")

    이렇게 했더니
    >> not enough values to unpack (expected 4, got 0) 이런 결과가 나왔습니다ㅠㅠ
    print(X.shape)
    print(Y.shape) 했더니
    (0,)
    (0,) 이렇게 출력이 됩니다.ㅠㅠ
    위의 댓글중에 대부분 경로 문제라고 하셔서 참고로 제 토마토 파일 경로는 C:\Users\USER20\tomato로, tomato 폴더 속에 "greenstomato"와 "redtomato" 폴더가 있습니다.
    caltech_dir을 잘못쓴것일까요..?ㅠㅠㅠ 도와주시면 진심으로 감사드리겠습니다.ㅠㅠㅠ (혹시 저장도 D드라이브에 저장되어야하나요..?)
  • 프로필사진 글 잘읽었습니다~ 2020.06.28 19:02 헐,, 저 여기에 있는 소스 다 성공했어요... 진짜 경로 문제였네요...
    caltech_dir 에서 폴더 위치를 (제 위치는 C:/Users/USER20/tomato/ 입니당) 이렇게 변경했더니 다 성공했어요ㅠㅠㅠ 세상에ㅠㅠㅠ 진짜 소스 공유해주셔서 진심으로 감사드려요ㅠㅠㅠ 복받으실거에요ㅠㅠㅠㅠㅠ
  • 프로필사진 오키여 이수진의 블로그 2020.06.28 20:36 신고 안녕하세요~
    오 ㅎㅎㅎ 다행입니다. 성공하셨군요.
    축하드립니다! 열공하세요
  • 프로필사진 감사합니다 2020.11.11 15:36 안녕하세요! 블로그 보고 참고하며 도움 받고 있습니다 감사합니다^^
    공유해 주신 코드에 보면 블로그 게시물과 달리
    train, val에 대한 loss값에 대한 그래프가 출력됩니다.

    코드를 수정해서
    train, val에 대한 accuracy 그래프 따로
    train, val에 대한 loos 그래프 따로
    를 출력하고 싶은데 잘 안됩니다..

    하는 방법이나 코드 알려주시면 감사하겠습니다!
  • 프로필사진 오키여 이수진의 블로그 2020.11.11 21:44 신고 안녕하세요.

    y_vloss = history.history['val_loss']
    y_loss = history.history['loss']

    에서 history.history[] 안에 accuracy가 있을겁니다.
    loss는 training에 대한, val_loss는 validation에 대한 것이니까, 아마 accuracy도 이렇게 나눠지지 않아있을까? 싶습니다. (정확하지는 않아요! 자세한 것은 history.history dictionary 결과 안 데이터를 봐야할 것 같은데 아마 있을겁니다.)
  • 프로필사진 좋은 설명 감사합니다 2020.11.13 12:48 안녕하세요 좋은 설명 잘 듣고 깃허브에 있는 소스를 가지고 이미지 분류기를 만들었습니다.

    5종류의 이미지를 분류하는 모델을 만들었고 데이터셋은 각 클래스 당 약 4500개로 학습을 진행하였습니다.

    블로그에서 설명하신 방식과 조금 다른점이 있다면 test셋을 따로 만들지 않고 train_test_split 에서 test_size=0.2 로 진행했고 validation set 은 깃허브에서 설명하신대로 test 셋을 쓰지 않고, validation_split=0.2 로 진행했습니다.

    모델 그래프는 loss 와 val_loss 둘다 0으로 수렴하는 모습과 acc와 val_acc도 1에 점점 수렴하는 모습을 보였습니다.
    그런데 이제 이 모델을 갖고 다른 이미지들을 테스트 해보는데 잘 못맞추는 현상이 있는데요

    모델을 최종적으로 complie 하는 과정에서 잘못된 부분이 있나 싶어 여러가지 optimizer로 바꿔가며 진행했음에도 모델 정확도 자체는 좋으나 다른 이미지 테스트에서 잘 맞추지를 못합니다.ㅜㅜ

    한가지 종류의 물체로만 인식하는 현상이 좀 심한거 같은데 이 부분 해결할 방법이 있나요?

    5개의 다른 이미지들을 맞추라고 했을때 predict 결과가 주로
    [[0.000, 0.000, 1.000, 0.000, 0.000],
    [0.000, 0.000, 1.000, 0.000, 0.000],
    [0.000, 0.000, 1.000, 0.000, 0.000],
    [0.000, 0.000, 1.000, 0.000, 0.000],
    [0.000, 0.000, 1.000, 0.000, 0.000]] 이런식으로 한가지 종류로만 예측을 해버립니다 ㅠㅠ

    정답은
    [[1.000, 0.000, 0.000, 0.000, 0.000],
    [0.000, 1.000, 0.000, 0.000, 0.000],
    [0.000, 0.000, 1.000, 0.000, 0.000],
    [0.000, 0.000, 0.000, 1.000, 0.000],
    [0.000, 0.000, 0.000, 0.000, 1.000]] 이건데요..

    제가 만든 모델은 주로 한가지 종류로만 예측하거나 아니면 예측을 하지 못하거나 이럽니다...ㅠㅠㅠ
    이런 현상을 혹시 어떻게 해결하시는지 알려주시면 감사하겠습니다...
  • 프로필사진 오키여 이수진의 블로그 2020.11.13 13:00 신고 안녕하세요.
    일단 overfitting이 의심되네요.

    아마 이미지가 4500개 정도면 굉장히 부족한 이미지 개수일 것 같습니다. 제 기억이 맞다면 최소 1만 5천개 정도는 필요해야 어느정도 overfitting이 감소되는 것을 볼 수 있었습니다(개인적으로 했을 때는요!)

    그리고 아마 predict로 하면 확률로 나올탠데 이 확률 값의 threshold를 좀 낮춰주시는 것도 방법일 것 같습니다. 85% 이상일 때 맞다고 해놓건은 threshold가 0.85라고 말씀하시는게 맞을까요?

    argmax로 했을 때 결과는 어떠한지도 살펴보셔야 할 것 같습니다.

    아마도 오버피팅 같아서 저 데이터셋 점검부터하셔야 할 것 같아요!
  • 프로필사진 좋은 설명 감사합니다 2020.11.13 14:29 한 클래스당 15000개의 이미지가 필요하다는 말씀이신거죠? 그러면 제가 클래스당 데이터셋을 조금 더 늘려보는 식으로 진행해보겠습니다.
    threshold가 if문에서 i[0]>0.85 에서 0.85를 지칭하는 것인가요? 저는 이 85%를 말씀드렸던거에요
    답변 감사드립니다.
  • 프로필사진 오키여 이수진의 블로그 2020.11.13 18:42 신고 네네 두 개다 맞습니다.
    데이터 늘려보시구, 그리고 데이터 퀄리티가 좋은지도 확인해보세요.

    네 그 threshold도 확인해보시면 도움이 될 것 같습니다!
  • 프로필사진 좋은 설명 감사합니다 2020.11.17 13:57 조언 주신대로 데이터셋을 늘리려고 Imagegenerator를 통해 5개 클래스 모두 이미지 증대를 시켰습니다. 각 클래스 당 15000개 이미지가 생성되었구요. 총 75000개 이미지로 학습을 진행했습니다.
    그러나 여전히 오버피팅이 해결되지 않았습니다 ㅠ 새로운 데이터들을 전에 말씀드린 것 처럼 그냥 한 종류로만 판단합니다..
    오버피팅이 해결이 안되는데 여러가지 방법들을 찾아보니까 해결하려면 1. 데이터 증대 2. validation_set 사용이라고 하더라구요. 1번은 이미지 증대를 통해 해결한 것 같고, 2번은 model .fit 에서 validation_split을 이용했는데 이렇게 validation_set을 갖추는것은 오버피팅을 해결하는데 큰 도움을 주지 못하나요?
    아 그리고 다중 카테고리 분류 모델은 softmax 함수를 사용하는것이 더 효율적인가요?
  • 프로필사진 오키여 이수진의 블로그 2020.11.19 09:28 신고 안녕하세요.

    무조건적인 데이터 증식은 옳지 않습니다. 안에 있는 데이터 퀄리티가 만약 좋지 않은 상태에서 imagegenerator를 돌려봤자 안 좋은 데이터만 더 늘어나니까요.

    가장 좋은 방법은 더 다양한 image를 가지고 오는 것입니다. imagenerator 말구요!

    음 validation_split을 하셨을 때 validation loss는 어떻게 나오시나요? 이것도 오버피팅으로 나오실까요?
  • 프로필사진 좋은 설명 감사합니다 2020.12.02 18:05 validation_loss 값은 점점 0에 수렴해가는 모습이고, 딱히 오버피팅이 나는 것 같지 않은게 그래프가 울퉁불퉁하게 나오질 않아서요.. val_loss 나 다른 값들의 그래프들도 마찬가지로 울퉁불퉁한 모습이 아니라 오버피팅이 날 것 같지 않은데 나서 ㅠㅠ
    이제 떠오른 대처 방안으로 데이터셋을 다 엣지추출을 이용해서 진행하려고 하는데 이렇게 되면 기존보다 더 좋은 결과를 기대할 수 있을 까요?
  • 프로필사진 오키여 이수진의 블로그 2020.12.02 19:51 신고 음 validation도 잘 떨어지는데 test를 했을 때 오버피팅이 나시는 것이죠?

    그러면 dataset 문제가 맞는 것 같습니다.
    1. 원본 training data / test data를 더 많이 수집하고
    2. 이 수집된 데이터가 정제가 잘 되어 있는지(이상한 이미지가 없는지 등) 노가다(?) 과정을 거친 후 다시 해본다

    위와 같은 방법을 해보는 것이 좋을 것 같아요!
    (제가 생각하기에는요!)
  • 프로필사진 감사합니다 2020.11.23 23:54 안녕하세요 CNN에 대해서 처음 배우고 있는 사람인데 덕분에 블로그 글을 보고 차근차근 나아가고 있습니다
    다만 지금 손실과 정확도가 loss: 1.1921e-07 - accuracy: 0.0000e+00 이렇게 뜨는 상황인데 어떻게 고쳐야하는지 아시나요??
    감사합니다!
  • 프로필사진 오키여 이수진의 블로그 2020.11.25 11:18 신고 안녕하세요

    음.. 정확히 어떤 것을 고치고 싶으신걸까요???
    정확도가 안 나오시는게 문제일까요?
    loss가 안 나오시는게 문제일까요?
    아니면 옆에 e-07 이렇게 뜨는걸 고치고 싶으신걸까요?
  • 프로필사진 잘 봤습니다 2020.12.30 10:11 7. predict_multi_img_with_CNN.ipynb
    를 주피터 노트북에서 사용할 때 두번째 블록에서

    Kernel Restarting
    The kernel appears to have died. It will restart automatically.

    이런 문구가 뜨면서 계속 에러가 발생하네요ㅜ

    구글에 검색해서 conda update mkl, numpy 재설치 등 여러 방법을 써도 해결되지 않아서 질문드립니다
    어떻게 해결하면 좋을까요..
  • 프로필사진 오키여 이수진의 블로그 2020.12.30 20:37 신고 안녕하세요.
    해당 에러는 코드상의 문제보단 커널이 죽는 문제인 것 같네요.
    혹시 메모리 등이 부족한 것 아닌가요?
    프로그램 상에서 메모리가 부족하면 그렇게 죽는 경우가 있습니다.
  • 프로필사진 잘 봤 2020.12.30 22:41 아 메모리 문제였군요.. 정말 많이 배워갑니다^^
    감사합니다
  • 프로필사진 잘 봤습니다 2020.12.30 22:50 또한

    prediction = model.predict(X)

    이 코드를 실행하면

    ValueError: Expect x to be a non-empty array or dataset.

    이런 에러가 뜨는데 구글에 검색해봐도 별다른 해결법을 주지 않더군요ㅜ

    ValueError Traceback (most recent call last)
    <ipython-input-37-e0e27905843c> in <module>()
    29 model = load_model('/content/model/dog_cat_classify.model')
    30
    ---> 31 prediction = model.predict(X)
    32 np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})
    33 cnt = 0

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py in predict(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)
    1642 callbacks.on_predict_batch_end(end_step, {'outputs': batch_outputs})
    1643 if batch_outputs is None:
    -> 1644 raise ValueError('Expect x to be a non-empty array or dataset.')
    1645 callbacks.on_predict_end()
    1646 all_outputs = nest.map_structure_up_to(batch_outputs, concat, outputs)

    ValueError: Expect x to be a non-empty array or dataset.

    총 에러는 이렇게 떴어요
  • 프로필사진 오키여 이수진의 블로그 2021.01.03 19:06 신고 해당 에러는 데이터가 들어가지 않아서 생기는 오류입니다. numpy에 데이터가 제대로 들어갔는지 확인해주세요!
  • 프로필사진 비전공코린이 2021.01.26 16:13 신고 구글코랩에서 체크포인트관련 오류가 계속떠서 CNN에서 계속 오류가떠서 공부하는 도중, 여기로왔네요 ㅎㅎ
    좋은 글 감사합니다! 부족한 부분을 더 알 수 있었지만 몇가지 질문이 생겼습니다.

    checkpoint를 .ckpt 파일로 저장을 해야하는건가요?
    또 체크포인트를 .h5 모델로 변환하는 방법도 알려주시면 감사하겠습니다!

    혹시 몰라서 제가 쓰는 코드도 첨부합니다.

    MODEL_DIR = './model'
    if not os.path.exists(MODEL_DIR):
    os.mkdir(MODEL_DIR)

    model_path = './model/check.ckpt'

    # early_stopping_callback
    checkpoint = ModelCheckpoint(filepath=model_path, monitor='val_loss', verbose=1, save_best_only=True)
    early_stopping = EarlyStopping(monitor='val_loss', patience=10)

    읽어주셔서 감사합니다!
  • 프로필사진 오키여 이수진의 블로그 2021.01.26 20:01 신고 안녕하세요!
    음 일단 텐서플로 2.x로 넘어오면서 조금 바뀐 부분도 있던 것으로 기억합니다.
    이 블로그 글이 조금 시간이 지난 글이라, 현재와 맞지 않을 수도 있는점 참고 부탁드립니다.

    당시 기준으로는 checkpoint는 model_name을 기준으로 해당 model을 계속 바라보며, 모델의 성능이 좋아지면 저장하도록 설계되어 있었습니다.

    그리고 확장자를 .model(혹은 ckpt)대신에 h5로 하시면 되는 것으로 기억합니다.

    자세한 것은 텐서플로2.x 문서를 봐야알 것 같아요!!
  • 프로필사진 비전공코린이 2021.01.26 21:56 신고 답변 감사합니다!

    혹시 코드 한줄 한줄을 공부할 수 있는 사이트나 책이 있을까요?

    올려주신 코드들은 이제 전체적인 흐름은 이해를 하고있지만,
    알고있는 내용을 예를들면 binary_crossentropy를 언제쓸지, 그리고 이와 같은 상황이 아니면 어떤 함수를 써야하는지를 자세히 공부를 하고싶습니다!
    코드 한줄 한줄을 완벽하게 이해하고싶은데 쉽게 설명한 자료를 찾기가 힘드네요..

    계속 다른분들에게 질문을 하고 이수진님의 블로그를 보며 배워왔습니다!
    계속 너무 쉬운 것만을 질문하는 것같아서.... 제대로 배우고싶습니다!
    추천 부탁드려도 될까요?
  • 프로필사진 오키여 이수진의 블로그 2021.01.27 17:19 신고 정말 기초적인 부분부터 시작하실꺼면
    밑바닥부터 시작하는 딥러닝 책이 정말 좋구요!
    (단, 이 책은 Keras 코드가 아닌 순수 Python으로 하나하나 코드를 짜면서 진행합니다)

    그 다음에 코드(Keras)를 보고 싶으시면 케라스 창시자에게 배우는 딥러닝 이라는 책과 모두의 딥러닝 책이 좋았던 것으로 기억이 납니다~

    아마 밑바닥 딥러닝 2권과, 케라스 창시자에게 배우는 딥러닝 책(또는 모두의 딥러닝)만 보셔도 자세히는 아니지만, 포괄적으로 이해를 하실 수 있으실겁니다!

    감사합니다
  • 프로필사진 로디네로 2021.03.19 01:58 신고 X = np.array(X)
    y = np.array(y)
    이부분에서 질문이 있습니다.
    제가 traindata가 512x512사이즈 10만장이 있는데.. 위의 코드를 실행하니 배열 크기가 터져서 메모리가 부족하다고 하네요
    이럴땐 어떤 방법을 써야하나요? Dataloader같은걸 이때 쓰면 되는건가요?
  • 프로필사진 오키여 이수진의 블로그 2021.03.19 21:27 신고 안녕하세요.

    네. 보통 그정도 크기면 local에서 돌리기엔 버거울 것 같습니다. 해결책은 여러가지가 있는데요.

    1. 이미지 크기를 줄인다 (128x128 등)
    2. numpy의 float64가 아닌 float32를 사용한다.
    3. yield 구문 등을 사용해서 진행한다.
    4. 메모리가 넉넉한 환경에서 진행한다.

    이렇게 대표적으로 있습니다.
    저는 local에서 실행할 때는 1, 2번을 사용했습니다.
  • 프로필사진 로디네로 2021.03.19 23:01 신고 답변감사합니다. 1,2번 바로 해봐야겠네요. 근데 이것도 한계가 있는방법이라... 만약 1억개의 데이터가 있으면 어떻게되나요? 혹시 배열로 저장을 안하고 바로 사용하는 방법도 있나요?
  • 프로필사진 오키여 이수진의 블로그 2021.03.20 19:29 신고 그때는 이야기가 달라집니다.
    local환경에선 절대 진행할 수 없겠죠?
    그러면 RAM이 넉넉한 환경

    1. 서버급 환경
    2. 분산 환경

    등에서 다루셔야 합니다.
    Scale-out이 가능한 환경이 좋습니다~
  • 프로필사진 로디네로 2021.03.21 18:47 신고 그렇군요.. 공부하다가 질문이 하나 더 생겼는데요
    Keras 사용방법중에 image를 ImageDataGenerator 로 불러올 수가 있더라구요. 그래서 그렇게 불러와서 train, val, test generator 를 만들어주니 램을 거의 안쓰면서 training 하게 되더라구요..??
    X=[] y=[] 에 np로 이미지 데이터를 넣어주는것과 뭐가 다른지, 왜 램을 거의 안쓰는지 궁금합니다!
    질문이 많아서 죄송합니다.. 광고라도 한번더 눌러드릴게요
  • 프로필사진 오키여 이수진의 블로그 2021.03.22 06:26 신고 저도 ImageDataGenerator의 내부 동작이 어떻게 되는지는 잘 모르겠지만, 아마 CS 지식으로 추정하자면..?

    numpy에 단순히 데이터를 넣어주는 것은 프로그래밍 상 메모리에 전부 올려두는 행위와 마찬가지입니다.

    프로그램 이라는 것이 CPU에 의해 실행 명령어를 받으려면 Memory에 올라가야 하니까요!

    아마 DataGenerator는 필요한 데이터만 메모리에 올려주고 나머지는 메모리에 올려두지 않은 구조를 채택 하지 않았을까 싶습니다. 마치 Python의 yield와 비슷한 원리겠죠
  • 프로필사진 로디네로 2021.03.22 12:54 신고 아.. 그렇게 생각해볼 수 있겠네요 매번 답변 감사합니다!! 도움많이됐습니다
  • 프로필사진 오키여 이수진의 블로그 2021.03.22 20:38 신고 네네! 부디 도움이 되셨길 바랍니다ㅠ 제가 Image쪽은 안 본지가 꽤 되어서.. 제대로 답변을 못해드린 것 같아요.
    다음에도 궁금한 것 있으시면 편하게 질문주셔요 :) 감사합니다.
  • 프로필사진 어려웡 2021.03.24 16:05 혹시 사용하신 코드 어디서 받을 수 있나요..
    완전히 처음하는 거라 결과물 봐가면서 연습하고 싶어서요..
  • 프로필사진 오키여 이수진의 블로그 2021.03.24 19:51 신고 안녕하세요. 글 상단에 코드가 있는 링크 있습니다. 참고해주세요
  • 프로필사진 잘하자그러자 2021.04.05 16:54 신고 안녕하세요.
    써주신 글 너무 잘 봤습니다. 하지만 실습을 해보려고 하는데 해당코드 주소를 눌러 다 찾아봐도 이미지 파일이 보이지 않네요....
    어떻게 받을 수 있을까요?...
    Source 코느는 여기서 찾았습니다. keras_basic/7.predict_multi_img_with_CNN.ipynb
    Source Code를 봤는데 GPU를 사용한 것 같은데 CPU만으로 사용도 가능 할까요?
    답변 주시면 감사하겠습니다.
  • 프로필사진 오키여 이수진의 블로그 2021.04.05 19:49 신고 안녕하세요.

    이미지 파일은 제공되고 있지 않습니다. 데이터 용량이 너무 크기에 올릴 수도 없구요. 이미지 파일은 이미 open data가 여럿 있습니다. CIFAR-10같은 데이터가 있으니 참고 부탁드립니다.

    CPU로도 물론 가능합니다. 하지만, GPU보다 훨씬 느릴 수 있습니다!
  • 프로필사진 2021.04.22 08:13 안녕하세여. 이미지 분류 공부하게 되면서 블로그 글을 보게 됐는데요!! 혹시 bin파일이나 python파일의 경우엔 어떻게 데이터를 불러올 수 있을까요?!!ㅠㅠㅠㅠ
  • 프로필사진 오키여 이수진의 블로그 2021.04.22 21:50 신고 안녕하세요.

    음 정확히 어떤 bin파일을 말씀하시는걸까요? 일단 불러오는 방법은 https://wikidocs.net/15101 을 참고하시면 되겠습니다!

    그리고 python 파일을 불러온다는 것이 무엇을 뜻하시는 건지 모르겠습니다.
  • 프로필사진 런닝 2021.04.26 22:29 제가 test 데이터를 1000개를 넘게 했는데도 불구하고 model.fit하면
    Epoch 43/50
    38/38 [==============================] 이런 식으로 38까지 밖에 학습을 안하는것 같은데 무슨 이유 때문 일까요..? ㅠ
  • 프로필사진 오키여 이수진의 블로그 2021.04.27 21:05 신고 안녕하세요.
    batch_size에 따라서 38까지 되는 것 같습니다.
    해당 파라미터 확인해보세요~
  • 프로필사진 6조 2021.05.11 15:24 import keras.backend.tensorflow_backend as K
    이라인에서
    No module named 'keras.backend.tensorflow_backend'; 'keras.backend' is not a package
    라는 오류가 뜹니다...
    어떻게 해결하면 좋을지...ㅠㅠ
  • 프로필사진 오키여 이수진의 블로그 2021.05.13 10:32 신고 안녕하세요. 답변이 늦었습니다.

    음.. 해당 글이 tensorflow version 1.x에서 작성된 것이라서 아마 버저닝 문제일 것 같습니다.

    tensorflow2.X로 넘어오면서 keras가 지원되고 이에 따라 제가 글을 작성한 시점과 좀 다른 부분이 있을겁니다.

    아마 keras를 사용하는 것을 tensorflow로 대체하시면 코드는 잘 동작하실겁니다 :)
  • 프로필사진 ㅇㅇ 2021.05.16 17:15 코드를 따라서 해보고 있는데 멀티라벨 분류에서 만들어진 npy 파일의 내용이 이상해서요
    Error! ~imge_data.npy is not UTF-8 encoded
    Saving disabled
    See Console for more details
    라고 파일로 출력이 되네요....
  • 프로필사진 오키여 이수진의 블로그 2021.05.17 21:27 신고 안녕하세요.
    흠.. 이 에러는 전 처음보네요.
    numpy 데이터를 잘 가지고 온 것이 맞으실까요??

    https://github.com/jupyter/notebook/issues/5003
    여기에 설명이 있는 것 같으니 참고해보세요!
  • 프로필사진 ㅇㅇ 2021.06.05 16:24 폴더의 개수를 5개로 늘려서 하고 있는데 에러가 나서요 4개로 바꾸면 괜찮습니다. 이유를 알 수 있을까요?!?!
  • 프로필사진 오키여 이수진의 블로그 2021.06.06 13:38 신고 안녕하세요.
    일단 제 코드가 4개 폴더 기준으로 진행되고 있습니다.

    categories 부분 리스트를 말씀해주신 5개로 바꿔주시고 종속되는 코드를 전부 5개의 폴더로 바꿔주시면 됩니다!
  • 프로필사진 2021.06.26 14:44 비밀댓글입니다
  • 프로필사진 2021.06.27 13:38 비밀댓글입니다
  • 프로필사진 혹시 지금도 보실까요.. 2021.08.16 15:03 안녕하세요 보실지 모르겠지만 독학 중 에러가 났는데 해결 방법을 못찾아 질문드립니다..
    위에서부터 차근차근 써오던 도중에

    X_train, X_test, y_train, y_test = np.load("./image_data.npy")
    model = Sequential()
    model.add(Conv2D(32, (3, 3), padding="same", input_shape=X_train.shape[1:], activation='relu'))
    이 마지막 줄에서 에러가 났는데 input_shape = X_train.shape[1:] 이것 때문에 그런것 같습니다
    에러 코드는 Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=3 입니다
    혹시 어떻게 수정해야 할지 알려주실 수 있을까요..? 글 정말 도움 많이 됩니다..
  • 프로필사진 오키여 이수진의 블로그 2021.08.17 07:40 신고 안녕하세요.
    해당 에러는 4d 형태로 데이터가 들어와야 하는데 3d로 데이터를 넣으셔서 에러가 나온 것 같습니다.

    CNN은 4개의 데이터 형식이 input으로 들어가야 합니다. 말씀해주신대로 shape가 문제이니, 데이터 점검을 한 번 확인해보시면 될 것 같습니다~
  • 프로필사진 우준세 2021.08.19 15:57 신고 caltech_dir = "./multi_img_data/imgs_others/train" 라고 쓰셨던데 그러면 train에 있는 데이터만 쓰신건가요?
    test에는 데이터가 따로 없으셨는지요?
  • 프로필사진 오키여 이수진의 블로그 2021.08.19 20:15 신고 안녕하세요.

    모델 훈련시에는 train 데이터만 사용해서 모델 training을 진행했습니다. 이후 모델을 최종 평가할 때 test 데이터를 사용했습니다~
  • 프로필사진 우준세 2021.08.20 09:31 신고 caltech_dir로 train을 지정해주고 거기서 라벨링 한 걸 다시 train과 test로 나눴다고 생각했습니다. 감사합니다
  • 프로필사진 오키여 이수진의 블로그 2021.08.26 20:27 신고 ㅎㅎ 넵 감사합니다~
  • 프로필사진 2021.09.15 04:26 안녕하세요 좋은 글 잘 봤습니다. 독학하는데 큰 도움이 되었습니다!
    근데 제가 제 데이터로 해보다가 오류가 생기는 부분이 있어 이렇게 글을 남기게 됩니다.
    마지막에 모델 최종평가를 할 때 prediction = model.predict(X)부분에서 ValueError: Expect x to be a non-empty array or dataset.과 같은 오류가 생겼을 때는 어떻게 해결해야 될까요..?
    해결방법을 찾지 못해서 글을 남깁니다.
  • 프로필사진 오키여 이수진의 블로그 2021.09.15 21:06 신고 안녕하세요.
    해당 오류는 model.predict를 할 때 넣는 X가 model fit할 떄와 다른 형태의 데이터이거나 null 데이터이기 때문에 나오는 에러입니다.
    해당 x의 형태를 점검해보시면 될 것 같습니다~
  • 프로필사진 2021.09.16 03:34 답변 감사합니다.
  • 프로필사진 2021.09.16 16:11 혹시 제가 test data를 약 7천장정도 가지고 있는데 이것을 성능평가하여 잘못된게 있는지 확인하려면 일일이 다 제가 확인하는 방법 말고 따로 코딩으로도 할 수 있을까요?
  • 프로필사진 오키여 이수진의 블로그 2021.09.20 11:50 신고 안녕하세요. 연휴라 답변이 늦었습니다.

    성능평가하여 잘못된게 있는지를 확인한다는 것이 어떤 의미이실까요?

    metric을 말씀하시는 걸까요? 사진 자체가 잘못되었다는 것을 말씀하시는걸까요?
  • 프로필사진 2021.09.26 11:20 코딩하신 이미지랑 코드 압축 파일이나 받아볼 수 있는 주소가 있을까요~??
    https://github.com/lsjsj92 에서는 못 찾겠어서 ㅠㅠ
    비밀글 안 보이네요 ㅠㅠ 다시 작성 합니다.
  • 프로필사진 오키여 이수진의 블로그 2021.09.27 19:10 신고 안녕하세요.

    해당 github에 가시면 관련 코드가 있습니다.
    블로그와 100% 일치하지 않을 수는 있지만, 그 github 코드를 이해하신다면 충분히 적용할 수 있습니다.
    제가 따로 코드나 이미지는 가지고 있지 않아서요.
    이미지는 cifar10 이라는 오픈 되어 있는 이미지를 사용하시면 됩니다!
댓글쓰기 폼