Tensorflow 102 - 이미지 분류(CNN)

내 이미지 사용하기

강의

실습

소스코드

colab |  backend.ai

###########################
# 라이브러리 로딩
import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf 

###########################
# 이미지 읽어서 데이터 준비하기
paths = glob.glob('./notMNIST_small/*/*.png')
paths = np.random.permutation(paths)
독립 = np.array([plt.imread(paths[i]) for i in range(len(paths))])
종속 = np.array([paths[i].split('/')[-2] for i in range(len(paths))])
print(독립.shape, 종속.shape)

독립 = 독립.reshape(18724, 28, 28, 1)
종속 = pd.get_dummies(종속)
print(독립.shape, 종속.shape)

###########################
# 모델을 완성합니다. 
X = tf.keras.layers.Input(shape=[28, 28, 1])

H = tf.keras.layers.Conv2D(6, kernel_size=5, padding='same', activation='swish')(X)
H = tf.keras.layers.MaxPool2D()(H)

H = tf.keras.layers.Conv2D(16, kernel_size=5, activation='swish')(H)
H = tf.keras.layers.MaxPool2D()(H)

H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(120, activation='swish')(H)
H = tf.keras.layers.Dense(84, activation='swish')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)

model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics='accuracy')

###########################
# 모델을 학습
model.fit(독립, 종속, epochs=10)

###########################
# 모델을 이용합니다. 
pred = model.predict(독립[0:5])
pd.DataFrame(pred).round(2)

# 정답 확인
종속[0:5]

# 모델 확인
model.summary()

 

 

댓글

댓글 본문
  1. ssehai
    혹시 직접 다운 받아서 하시는 분들에게(windows11),

    paths = glob.glob('.\\notMNIST_small\\*\\*.png')

    train부분은 문제가 없었으나, test부분에서 인덱스를 벗어났다는 에러가 뜰 수 있는데 이럴 때는,

    test = np.array([paths[i].split('\\')[2] for i in range(len(paths))])

    이렇게 바꿔서 적으시면 해결됩니다!

    좋은 강의 감사합니다!
  2. 내가머더라
    아 해결됬습니다.
    대화보기
    • 내가머더라
      ###########################
      # 라이브러리 로딩
      import glob
      import numpy as np
      import pandas as pd
      import matplotlib.pyplot as plt
      import tensorflow as tf

      ###########################
      # 이미지 읽어서 데이터 준비하기

      # 제가 직접 다운 받아서 써보려고 했습니다. (바뀐 부분)
      paths = glob.glob('C:/Users/hs/Desktop/khs/notMNIST_small/notMNIST_small/*/*.png')
      paths = np.random.permutation(paths)
      독립 = np.array([plt.imread(paths[i]) for i in range(len(paths))])
      print([paths[0].split('/')[-2]])
      종속 = np.array([paths[i].split('/')[-2] for i in range(len(paths))])
      print(독립.shape, 종속.shape)

      (질문)
      제 ide환경 파이참에서 실행보려고 했습니다.
      제가 직접 다운받아서 해보려고 했는데 /*/* 위치 부분을 읽지 못하더라고요?
      아래와 같이 실행을 해봤습니다.

      종속[0:2]
      이렇게 치면
      array(['notMNIST_small', 'notMNIST_small'], dtype='<U14')
      이런 결과가 나오는데 인덱스 순서상 notMNIST_small 폴더이름만 주구장창 가져오는거 같아서요.
      인덱스를 늘리고 줄임을 반복한 결과
      /*/* 이부분을 읽지 못하더라고요
      [-2] 독립변수로 알파뱃 이름이고
      [-1] 종속변수로 png파일인데
      파이참 환경에서는 왜 안되는지가 의문입니다.
      콜랩해서 하면 되는데 왜하냐고 물으시면..
      종국에는 제가 파일을 다운받고 제 컴퓨터환경에서 시키기위해서는 알아야 하는 과정같아서 질문합니다.
    • Hotbrains
      완료~ 감사합니다.
    • 매운탕탕탕수
      완료!
    • 정효빈
      감사합니다!
    • nann
      완료
    • 고고고고
      완료
    • hoddigi
      완료
    • 여어엉
      완료
    • 제사마
      Done
    • John
      완료
    • 과거로의여행
      흐흐흐... 두 번을 봤는데...
      ㅎㅎㅎ... 좀 더 이해가 되긴하네요. ㅎㅎㅎ
    • 과거로의여행
      OK~~~
      근데요, 이미지 한장으로 판단을 하지 못하는 것도 있지 않나요?
      예를 들면 병원에서 사용하는 X-ray 단층 사진이나 MRI 단층 사진은 여러장을 보고, 병(암)이 있는지? 없는지? 판단하는 것 같은거요.
      이런 것들은 단순하게 CNN으로 되지는 않을 것 같은데요. 궁금해 지네요.
      요즘 의료 분야 인공지능 벤처기업들이 많이 생겨나고, 실제로 병원에 활용되고 있기도 하던데 말이죠.
      그런 것들은 아주 고급으로 어렵겠죠???
      아~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    • VIBOT
      ok
    • 완료
    • CrashOverride
      5일차 시작
    • YoonJae
      제가 파이참으로 실행해서 그렇네요 / 가 아닌 \\ 로 수정하니 원하는 값을 얻을 수 있었습니다.
      대화보기
      • 이선비
        종속 변수 원핫인코딩을 안하신 것 같아요. 이미지 샘플 데이터의 경우는 원핫인코딩을 하지 않아도, sparse_ctegorical_crossentropy를 설정하면 모델 내부에서 원핫인코딩하여 결과를 냅니다.
        다만, 이 경우 종속변수가 문자열로 되어있을 경우에는 사용할 수 없고, 숫자 인덱스로 변환이 되어있어야 합니다.
        대화보기
        • YoonJae
          강의 잘 봤습니다.

          마지막에 loss = 'sparse_categorical_crossentropy' 로 바꿔야지 프로그램이 돌아가는데 맞나요?

          'categorical_crossentropy'로 하면

          Shapes (None, 1) and (None, 10) are incompatible 로 나옵니다.
        • briliant6424
          21/01/10 완료
        • 행여
          감사합니다~!♡
        • 유니엘
          완료.
          수고하셨습니다.
          잘봤습니다.^^
        • ukmadang
          다 듣고 반복하러 갑니다!
        • younghwani
          21.01.08 완료! 좋은 강의 감사합니다~
        버전 관리
        이선비
        현재 버전
        선택 버전
        graphittie 자세히 보기