github.com/jonhyuk0922/Tensorflow-Dev/blob/main/Course1_2_Introduction_to_Computer_Vision.ipynb
안녕하세요
27년차 진로탐색꾼 조녁입니다!
오늘은 텐서플로우 자격증 과정 첫번째 강좌인
'Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning'
2주차 강의(Introduction to Computer Vision) 및 자료를 공부했습니다.
첫번째 영상, A Conversation with Andrew Ng
1주차와 마찬가지로 이번 주차에 어떤 것을 배울 지 두 아저씨(?)가 나오셔서 이야기를 나눕니다.
우리가 입은 옷이 검은 색옷이라는 걸 인식해서 분류하는 방법에 대해 이미지 data와 그에 해당하는 라벨을 학습시켜서 구현할 수 있다고 이야기하십니다.
두번째 영상, An Introduction to computer vision
우리는 위 사진에서 셔츠, 청바지, 핸드백을 구분할 수 있는 능력이 있다. 하지만 기계는 첨 본다면 구분할 수 없을 것이다. 그러므로 많은 양의 학습이 필요하다(머신러닝은 모델을 학습시킬 데이터가 중요). 다행히도 28*28로 거의 형태만 알아볼 수 있는 구린 화질(적은 용량)으로 된 Fashion MNIST 를 이용해서 학습 후 분류할 수 있다.
세번째 읽기자료, Exploring how to use data
Fashion MNIST 자료를 찾을 수 있는 git_hub 주소를 알려줍니다.
github.com/zalandoresearch/fashion-mnist
네번째 영상, Writing code to load training data
우리가 이전에 썼던 코드와 비슷하겠지만 이번엔 데이터의 크기가 크다. 그럼에도 Tensorflow에서 API 호출이 있는 데이터 세트로 사용할 수 있기 때문에 여전히 간단합니다.
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
keras 데이터베이스에서 로드 유형 MNIST의 객체를 선언한다. 이 때 7만개의 데이터가 있다면 6만개는 train, 1만개는 test 셋으로 나눈다. 이유는 학습한 모델이 어느정도 성능을 내는 지 후에 확인할 수 있도록 하기 위함이다. 또한 각 이미지에 라벨은 숫자로 달아준다.
왜냐하면 1) 컴퓨터는 숫자를 더 편하게 인식한다. 2) 숫자는 다양한 언어에 편향이나 편견없이 적용 가능하다.(영어,중국어,한국어,일본어 등)
다섯번째 읽기자료, The structure of Fashion MNIST data
숫자로 레이블을 붙여주는 것은 편향을 피하는 첫번째 방법이다. 이에 대한 자세한 공부는 아래 링크를 참고하면 된다.
ai.google/responsibilities/responsible-ai-practices/
여섯번째 영상, Coding a Computer Vision Neural Network
이전에는 1개의 층으로만 이루어진 모델을 구현했다. (y=2x-1) 그러나 이번에는 복수의 층을 구현하는데 첫줄에서 input layer는 우리가 사용할 데이터(Fashion MNIST) 형태인 28*28을 한줄로 펴서 Flatten(input_shape(28,28)) 으로 받는다.
다음으로 마지막 줄에선 Dense 10을 가지는데, 이유는 10가지 카테고리 의류 중 하나로 분류하기 때문이다.
중간 층은 hidden layer라고도 불리는데 여기서는 weight(가중치)가 각 뉴런(?)마다 주어진다.
model1 = keras.Sequential([
keras.layers.Flatten(input_shape(28,28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)])
여덟번째 영상, Walk through a Notebook for computer vision
train data로 학습하고 test data로 성능보면 train data와 비교했을 때 loss값이 커진다.
아홉번째 읽기자료, Get hands-on with computer vision
8가지 예제, 최소 1시간은 공부해보는게 좋다.
예제를 통해 배운점
1. classifications에서 나온 10개 숫자는 10개의 라벨별 매칭정도를 나타낸다. 즉, 아래와 같이 10개 값을 반환했을 때 10번째 반환한 값이 가장크므로 10번째 라벨에 해당되는 부츠의 이미지를 올바르게 예측하고 있음을 확인할 수 있다.
2. epoch을 5 -> 15으로 증가시켰을 때, 그리고 hidden layer의 dense를 128 -> 1024로 늘렸을 때 시간이 더 걸렸지만 정확도는 올라감
3. 첫번째 층은 input data와 shape을 맞춰줘야 하는데, 28개 뉴런*28개 layer는 부담스러우니 평면화 Flatten()을 사용해준다.
4. 마지막 층(출력층) 의 Dense는 라벨의 갯수와 동일하게 맞춰줘야 한다.
5. training image & test image 를 정규화(. /255)해주지 않으면 모델을 fit 해줄 때 type-error가 뜬다.
6. 일정 이상 epoch을 돌리면 과대적합이 일어난다. 그것을 방지하기 위해 콜백을 사용하면, 내가 설정한 기준 이상이 되면 epoch을 더 돌리지 않는다.
열한번째 읽기자료, See how to implement Callbacks
[최종 computer vision 의류 분류 코드]
import tensorflow as tf
print(tf.__version__)
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('loss')<0.4):
print("\nReached 60% accuracy so cancelling training!")
self.model.stop_training = True
callbacks = myCallback()
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])
이후 퀴즈로 8문제 객관식 문제 풀었는데, 위에 제가 배운점 정리한 것 내에서 나와서 손쉽게 풀고 2주차 마칠 수 있었습니다.
p.s 과제 진행중 알게 된 사실 , 쥬피터랑 colab 버전 차이인 지, 환경 차이인 지 몰라도 colab에서는 'accuracy'든 'acc'든 다 되는 반면, 쥬피터에서는 'acc'만 가능했다.
과제 : Fashion MNIST 99% 분류하기