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. Hotbrains
    완료~ 감사합니다.
  3. songji
  4. 이덕규
    완료!
  5. 마시모
    완료~
  6. 정효빈
    감사합니다!!
  7. SoHaeng Lee
    감사합니다. 텐서플로우 업그래이드 하고 테스트해보겠습니다.
    대화보기
    • 이선비
      답변이 좀 늦었네요 :) 아마 텐서플로우 버전이 낮아서 그럴거에요. 버전을 올리시거나, swish 대신 relu를 사용하시면 될거에요.
      대화보기
      • SoHaeng Lee
        안녕하세요. 강의 잘 보고 있습니다.

        에러가 발생해서 질문 드릴까 합니다.
        42라인에서 ValueError: Unknown activation function:swish 라는 에러가 발생하는데요.
        어떤 이유에서 그러는지 잘 모르겠습니다. ㅜㅜ
      • 이선비
        임의로 정한 것 맞습니다. :)
        이 수업에서는 84라는 숫자를 lenet에서 사용되는 숫자여서 사용을 했습니다.
        대화보기
        • 후니
          완료
        • 회색곰
          수강완료
        • nann
          완료
        • 고고고고
          완료
        • esc247
          Epoch 1/5
          1875/1875 [==============================] - 5s 2ms/step - loss: 7.0728 - accuracy: 0.8282
          Epoch 2/5
          1875/1875 [==============================] - 5s 2ms/step - loss: 0.5530 - accuracy: 0.9311
          Epoch 3/5
          1875/1875 [==============================] - 5s 2ms/step - loss: 0.4252 - accuracy: 0.9454
          Epoch 4/5
          1875/1875 [==============================] - 5s 2ms/step - loss: 0.3792 - accuracy: 0.9510
          Epoch 5/5
          1875/1875 [==============================] - 5s 2ms/step - loss: 0.3476 - accuracy: 0.9579
        • 제사마
          Done
        • John
          완료
        • 과거로의여행
          아~~~ 점점 어려워 지는데요~~~
          졸리기도 하고~~~
          오늘은 여기까지... 모두들 좋은 밤 되세요~~~
        • 여어엉
          84라는 숫자는 임의로 정한 숫자인거겠죠???
          완료.
        • 호호
          완료
        • VIBOT
          ok
        • CrashOverride
          2일차 완료
        • 완료
        • hoddigi
          완료
        • Ray Seo
          완료
        • CSHOP
          완료
        • briliant6424
          21-01-10 완료
        • 행여
          감사합니다~!♡
        • 이선비
          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 자세히 보기