Tensorflow 102 - 이미지 분류(CNN)

다섯번째 딥러닝 1 - Flatten

수업소개

이미지셋 데이터를 표 형태의 데이터로 변형해서 학습하는 법을 배웁니다. 딥러닝 모델의 "특징 자동 추출기"라는 별명의 의미를 이해합니다. 

 

강의

실습

소스코드

colab |  backend.ai

###########################
# 라이브러리 사용
import tensorflow as tf
import pandas as pd

###########################
# with reshape

# 데이터를 준비하고
(독립, 종속), _ = tf.keras.datasets.mnist.load_data()
독립 = 독립.reshape(60000, 784)
종속 = pd.get_dummies(종속)
print(독립.shape, 종속.shape)

# 모델을 만들고
X = tf.keras.layers.Input(shape=[784])
H = tf.keras.layers.Dense(84, activation='swish')(X)
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])
print(pd.DataFrame(pred).round(2))
print(종속[0:5])

###########################
# with flatten

# 데이터를 준비하고
(독립, 종속), _ = tf.keras.datasets.mnist.load_data()
# 독립 = 독립.reshape(60000, 784)
종속 = pd.get_dummies(종속)
print(독립.shape, 종속.shape)

# 모델을 만들고
X = tf.keras.layers.Input(shape=[28, 28])
H = tf.keras.layers.Flatten()(X)
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])
print(pd.DataFrame(pred).round(2))
print(종속[0:5])

댓글

댓글 본문
  1. 완료
  2. 과거로의여행
    아~~~ 점점 어려워 지는데요~~~
    졸리기도 하고~~~
    오늘은 여기까지... 모두들 좋은 밤 되세요~~~
  3. 여어엉
    84라는 숫자는 임의로 정한 숫자인거겠죠???
    완료.
  4. 호호
    완료
  5. VIBOT
    ok
  6. CrashOverride
    2일차 완료
  7. 완료
  8. hoddigi
    완료
  9. Ray Seo
    완료
  10. CSHOP
    완료
  11. briliant6424
    21-01-10 완료
  12. 행여
    감사합니다~!♡
  13. 이선비
    Dense라는 뜻이 '밀집되어 있다'는 뜻이죠. 앞 노드 전체를 사용한다는 의미로 '전결합 계층', 'fully connected layer' 라는 뜻이 있는데요. 같은 의미로 'Dense'라는 단어를 함수 이름에 사용한 겁니다.

    다른 레이어를 알고 싶으시면 다음 링크를 참고하시면 되는데요.
    https://www.tensorflow.org......ers

    많이 쓰이는 몇개를 고르는 건 조금 어렵습니다. 절반 정도는 자주 쓰이는 레이어라고 할 수 있거든요.
    그리고 많이 쓰이는 레이어를 쓰면 무조건 좋은 건 아니에요.
    어떤 구조에서 어떤 레이어가 어떤 의미를 갖는지 각 레이어마다 공부를 하셔서 쓰셔야 합니다.

    지금 배우신 것 위주로 사용해 보시면서 비슷한 기능의 새로운 레이어를 하나씩 점령해 가시기를 추천드립니다. :)
    대화보기
    • hoon9593
      항상 도움되는 강의 감사합니다.

      계속 궁금했던 건데 레이어 중에 Dense 레이어의 의미를 알 수 있을까요?
      그리고 Input과 Dense layer 외에 많이 쓰이는 레이어도 알고 싶습니다!
    • 안멘
      완료!
    • ukmadang
      항상 감동입니다! 아마 공동수업참여자 중 제가 제일 이해를 못하고 있을 것 같지만, 계속 따라 듣고, 또 반복하고, 모르면 찾아서 추가 학습을 해 보겠습니다. 오늘도 고맙습니다!
    • 월령가
      오늘은 여기까지 밖에 못했네요ㅠㅠ
      개념이 점 점 복잡해지네요ㅠㅠ
      코드는 이해를 하겠는데ㅎㅎ
      그래도 재미있어서 파이팅 할 수 있습니다!
    • younghwani
      21.01.06 완료!
    • tf1 에서 tf2로 스크립트 수정하다 GD optimizer를 SGD로 생각없이 바꾸게 되었는데 이에 대해서도 이해할 수 있게 되었습니다. 정말 감사합니다.
      대화보기
      • 유니엘
        완료
      • noahhan
        답변 감사합니다!
        대화보기
        • 이선비
          적당한 개수를 찾는 알고리즘은 없습니다. :)
          머신의 성능, 데이터의 양, 데이터의 형태, 적용하려는 문제의 수준 등 상황에 따라 적절한 정도가 다르기 때문이기도 하고, 어느 정도의 모델에서 만족할 것인가와 관련이 있어서 모델을 만드는 개인마다 선택이 달라지기도 하죠.

          데이터가 빈약한데 모델을 무작정 크게 한다고 학습이 잘 되지 않고, 모델이 말이 안되게 작게 하면 제대로 된 성능을 낼 수 없으니, 어느 정도의 범주 내에서 조절할 것인가 느낌만 알고 있을 뿐입니다.

          딥러닝의 경우는 underfitting보다는 overfitting이 문제가 되긴 합니다. overfitting의 이유는 적당히 크게 만든 딥러닝 모델은 생성해내는 수식이 어떤 형태의 함수라도 최적으로 모사할 수 있는 능력이 있기 때문입니다. 딥러닝에서는 overfit을 해소하는 방법에 대해 공부가 필요한 이유에요. :)
          대화보기
          • Kim Yumi
            이해하지 못했던 부분을 이해 할 수 있는 시간이었습니다!!
          • 오애이오
            안녕하세요, 강의에서는 84개의 노드들을 컴퓨터가 스스로 찾았다고 해주셨는데, 적당한 개수를 도출해주는 알고리즘이 따로 있나요? 1~100까지 반복문을 돌리기에는 너무 비효율적일것도 같아서.. 그리고 찾아보니 노드(뉴런이라고도 표현하네요)의 개수가 너무 많으면 overfitting이 일어난다고 하는데, 그 원리가 MLE의 경우와 같은지 궁금합니다. 구글링해보면 대체로 rules of thumb이 뭔지만 알려주고 있어서 여기에도 여쭤보고 싶네요!
          • 이선비
            중간에 넣고 싶었는데, 뭔가 좀 동떨어져 보이기도 해서, 아마도 다음 후속 수업에는 그 내용을 넣으려고 계획하고 있네요. 미리 설명을 드리자면, 텐서플로우의 fit 함수는 학습을 할 때에 전체 관측치를 모두 넣어서 학습을 하는 것이 아니고, batch size로 나누어서 1 epochs에 여러 개의 batch를 가지고 학습을 하도록 구현 되어있어요.

            수업에서는 1 epoch에 모든 데이터를 넣어서 결과를 내고 loss를 구하고 loss가 낮아지는 방향으로 weight를 조정하여 학습을 한다고 설명을 드렸죠. 학습 알고리즘 중에 가장 기본적인 알고리즘인 gradient descent (GD) 알고리즘을 가지고 설명을 드린거에요. 이 경우 관측치가 100개이든 10000개이든 1 epoch에 weight를 한 번 조정하게 되는데, 데이터가 많아질수록 weight를 조정하는 횟수로 인해 연산의 비효율이 생깁니다.

            이를 해결하기 위해서 batch로 나누어서 학습을 하는 방법을 고안했고, 그 방법을 stochastic gradient descent (SGD) 라고 해요. 10000개의 관측치가 있다고 할 때 1000개씩 나누면, 1 epoch에 10변의 weight 조정을 할 수 있게 되죠.

            텐서플로우는 batch size의 기본값으로 32개씩 나누어서 학습하도록 되어있고, 60000 / 32를 하여 1875개의 batch로 나누고, 1epoch당 1875회의 weight 조정을 합니다. model.fit(독립, 종속, epochs=10, batch_size=100) 이라고 넣으시면 1 epoch에 600회 학습하는 걸 볼 수 있을 거에요.
            대화보기
            • 한 epoch당 1875개의 시뮬레이션을 돌렸다고 이해했는데 저도 궁금하네요
              대화보기
              • noahhan
                이전 강좌에서도 궁금했던 건데 model 학습과정에서
                Epoch 3/10
                1875/1875 [==============================] - 4s 2ms/step - loss: 0.5352 - accuracy: 0.918

                이 1875/1875의 1875라는 숫자는 어떤 값인가요??
              버전 관리
              이선비
              현재 버전
              선택 버전
              graphittie 자세히 보기