github.com/jonhyuk0922/Tensorflow-Dev/blob/main/Course1_4_Using_Real_world_Images.ipynb
안녕하세요
27년차 진로탐색꾼 조녁입니다!
오늘은 텐서플로우 자격증 과정 첫번째 강좌인
'Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning'
4주차 강의(Using Real-world Images) 및 자료를 공부했습니다.
듣다보니 코드프레소에서 작년말에 들었던 인공지능 교육 내용들이 새록새록 기억이 나네요 ㅎㅎ ( 벌써 3달전이라니..ㅠ)
퇴사 후 많이 게을러져서 아직도 복습안했지만 그래도 두번째 듣다보니 익숙해지는 감이 있는 것 같아요.
첫번째 영상, A conversation with Andrew Ng
3주차 강의 리뷰해보면 우리가 지금 사용하는 네트워크는 아직 제한된 부분들이 있다. 왜냐면 우리가 지금 사용하는 데이터셋들은 28*28*1 로 정해져있지만, 실제 이미지는 픽셀 크기가 다를 수도 있고 컬러일 수도 있기 때문이다. 그럼에도 우리가 학습하고 있는 모델들이 자율주행 자동차에서 물체를 인식할 때 쓰이는 모델들과 유사한 점이 있다.(라고 응원하심)
다음 영상에선 더 크고 복잡한 이미지들에 CNN을 어떻게 적용할 지 배울 것이다.
두번째 읽기자료, Explore an impactful, real-world solution
카사바 식물이 주식인 마을에 텐서플로 기반 이미지 분류기앱을 지원함으로 농장 경영에 도움을 준 사례 소개 <영상 참고>
www.youtube.com/watch?v=NlpS-DhayQA
세번째 영상, Understanding ImageGenerator
우리가 실제로 작업할 때, 여러개의 이미지가 아래 사진과 같이 가로 세로 비율이 다르거나, 종이 다를 수도 있다고 이야기한다.
이런 경우 같은 사이즈로 전처리를 해야하는데, 이 과정을 도와줄 API를 몇 가지 알려 준다. 그 중에서도 tensorflow 이미지 생성기는
디렉토리(dir)를 지정할 수 있다. 아래 표와 같이 Images 디렉토리 하위 디렉토리에 말과 인간의 디렉토리가 따로 만들어져서 손쉽게 분류할 수 있다.
또한 이렇게 분류하는 keras 코드는 로드 시 사진들의 크기를 자동으로 맞춰줘서 수천장 전처리할 수고를 덜어준다. (학습 데이터의 모든 사진은 크기가 같아야 한다.)
from tensorflow.keras.preprocessing.image
import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255) #이미지 정규화
train_generator = train_datagen.flow_from_directory( #이미지를 디렉토리와 하위 디렉토리에서 부를 수 있는 generator를 정의
train_dir,
target_size=(300,300),
batch_size=128,
class_mode='binary')
사람들이 쉽게하는 실수 중 하나는 첫번째 변수 지정을 하위디렉토리에 두는 것 ! 하위 디렉토리를 포함한 디렉토리를 지정해야한다.
이후 노트북에서 zip 파일을 받은 후 train,validation 그리고 horse,human 디렉토리로 나눠서 지정하는 것을 배운다.
이것은 딥러닝도 텐서플로우도 아니고 그저 파이썬 코드다.
네번째 읽기자료, Desugning the neural network
ImageGenerator가 디렉토리에서 이미지를 flow하고 즉시 크기 조정하는 작업을 봤다면 이젠 다음 영상에서 복잡한 이미지를 처리할 신경망에 대해서 배울 것이다.
다섯번째 영상, Defining a ConvNet to use complex images
좀더 복잡한 이미지를 처리할 때 neural networks(신경망) 가 어떻게 변화하는 지 살펴보자.
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3) , activation='relu', input_shape =(300,300,3)),
tf.keras.layers.Maxpooling2D(2,2),
tf.keras.layers.Conv2D(32,(3,3), activation='relu'),
tf.keras.layers.Maxpooling2D(2,2),
tf.keras.layers.Conv2D(64,(3,3), activation='relu'),
tf.keras.layers.Maxpooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
model 코드를 살펴보면 입력층에서 input shape이 컬러로 (300,300,3)으로 바뀐것을 확인할 수 있다. 그리고 더 복잡한 이미지를 처리하기 위해 컨볼루션-풀링 세트도 세개로 늘었으며 , 마지막 출력층의 Dense가 1로 바뀌고 활성화함수가 시그모이드로 바뀐것을 볼 수 있다.
이는, 바이너리 분류에 더 적합하기 때문이다.
모델 요약을 살펴보면, flatten_1 층에서 78,400 픽셀이 DNN에 공급되는 것을 볼 수 있다. 만약 컨볼루션을 거치지 않았다면 DNN에는 90,000이 넘는 픽셀이 공급되었겠지만 컨볼루션을 통해 많이 줄일 수 있었다.
여섯번째 읽기자료, Train the ConvNet with ImageGenerator
신경망을 정의했으니 이제 학습을 시킬건데 우리는 기존 model.fit 메서드가 아닌 model.fit_generator을 사용할 것이다. 다음 영상에서 확인할 수 있다.
일곱번째 영상, Training the ConvNet with fit_generator
model을 컴파일할건데, 이전에 진행했던 것과 달리 이번엔 loss함수와 optimizer를 변경했다. RMSprop은 학습 진행 상태를 확인할 수 있는 옵티파이저인데 자세한 내용은 아래 링크에서 확인할 수 있다.
영상 요약 : RMSprop 옵티마이저는 학습률을 지정할 수 있다. 그 중 학습률이 너무 크면, 경사하강법에서 계속 오버하여 다음 포인트를 찍다보니 수렴하지 않게 된다. 그렇다고 너무 작으면 학습속도가 느려지기 때문에 여러가지 학습률(예를 들어, 0.001 , 0.01 , 0.1 , 1) 로 학습률을 지정해서 실험해보고 가장 잘 맞는 걸 사용하기를 권장한다.
from tensorflow.keras.optimizers import RMSprop
model.compile(loss='binary_crossentropy',optimizer=RMSprop(lr=0.001),metrics=['accuracy'])
이제 학습을 시킬건데, (학습 데이터를 generator통해 불러오기떄문에) data대신 generator를 넣어준다.
학습 디렉토리에는 1,024개 이미지가 있고 우리는 한번에 128개 이미지를 로드하므로 step_per_epochs = 8이다. verbose는 훈련이 진행되는 동안 표시할 양을 지정하는데 1면 epoch 진행률을 더 상세히 보여준다.
#Training
history = model.fit_generator(
train_generator,
step_per_epochs = 8,
epochs=15,
validation_data=validation_generator,
validation_steps=8,
verbose=2)
import numpy as np
from google.colab import files
from keras.preprocessing import image
uploaded = files.upload()
for fn in uploaded.keys():
#predicting images
path = '/content/' + fn
img = image.load_img(path, target_size = (300,300))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
image = np.vstack([x])
classes = model.predict(images, batch_size=10)
print(classes[0])
if classes[0]>0.5:
print(fn+"is a human")
else:
print(fn+"is a horse")
여덟번째 읽기자료, Exploring the solution
지금까지 우리는 신경망을 구축하고 on-disk 이미지를 학습시켜서 새로운 이미지를 예측하는 법을 배웠다. 다음 강의에서 실제로 수행하는 것을 단계별로 차근차근 알려줄 것이다.
아홉번째 영상, Walking through developing a ConvNet
colab 노트북에서 순서대로 보여줌.(zip 파일 다운로드 > train,test 각각 디렉토리 지정 > 모델 정의 > 모델 컴파일 )
열번째 읽기자료, Training the neural network
다양한 공부자료 제공해주었다.
Binary Crossentropy : gombru.github.io/2018/05/23/cross_entropy_loss/
RMSProp : www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf
binary classfication : www.youtube.com/watch?v=eqEc66RFY0I&t=6s
열한번째 영상, Walking through training the ConvNet with fit_generator
자동으로 하위 디렉토리에 이미지가 분류되는 Keras기반으로 어떻게 CNN을 가진 말&인간 분류기를 만드는 지 보여준다.
그리고 학습 시킨 후 , 픽사베이에서 이미지 가져와서 분류기에 넣어본다.
열두번째 읽기자료, Experiment with the horse or human classifier
이미지 분류기 코드가 짜여진 노트북주고 직접해보라고 함. epochs, hidden layers 조정해서 더 정확한 수치를 내보세요~!
열세번째 영상, Adding automatic validation to test accuracy
이번에는 분리된 validation data zip을 다운로드해서 디렉토리에 지정해준다.
모델은 전에 본 노트북과 동일하다. 다만 이미지 분류기를 validation에 대해 하나더 만들어줘야한다.
이 때, 몇몇 이미지를 잘못 분류했다. 이에 대해서 실패하는 위치와 이유를 이해하면 학습 데이터를 수정하여 오류를 방지하는 방법을 이해하는데 도움이 될 수 있습니다.
열네번째 읽기자료, Get hands-on and use validation
로렌스가 사용하던 노트북이다. 직접 실행해보고 다음 영상으로 가라. 다음 영상은 데이터를 압축하여 학습시킬 때 미치는 영향에 대해 알려준다.
열다섯번째 영상, Exploring the impact of compressing images
학습 데이터를 300*300 에서 1/4에 해당되는 150*150으로 줄였을 때 어떤 일이 일어나는 지 살펴보자. 기존에는 오류를 발생하지 않던 이미지를 분류하지 못함 (드레스입고 뒤돌아 있는 여성)
열여섯번째 읽기자료, Get Hands-on with compacted images
150*150 으로 줄인 노트북으로 직접 사용해봐.
퀴즈
처음으로 불합격했다. 동영상의 갯수도 길이도 너무 많아서 압도되다보니 제대로 공부안하고 봐서 그런 것 같다. 멘탈부여잡고 다시 공부해서 봤더니 통과했다!! 아래에는 오답노트로 정리해놨다.
퀴즈 오답 노트
1. How did we specify the training size for the images?
1) The target_size parameter on the validation generator
2) The training_size parameter on the training generator
3) The training_size parameter on the validation generator
4) The target_size parameter on the training generator
풀이: 4번, training 분류기의 타겟 사이즈로 지정한다. 왜냐면 training 분류기로 분류하며 분류할 이미지와 학습할 이미지의 크기가 동일해야하고 우리는 분류하는 것이 목표이므로 타겟이미지의 크기에 기준한다. (뭔 말이지 .. 나중에 보면 더 정리해서 쓰자.)
2. Convolutional Neural Networks are better for classifying images like horses and humans because:
1) In these images, the features may be in different parts of the frame
2) There’s a wide variety of horses
3) There’s a wide variety of humans
4) All of the above
풀이: 4번, 대체로 이런문제는 3개 다가 정답이다. 말과 사람의 형태 및 각도는 다양하므로 그 특징을 찾아주는 CNN이 분류에 유리하다.
3. After reducing the size of the images, the training results were different. Why?
1) There was more condensed information in the images
2) We removed some convolutions to handle the smaller images
3) The training was faster
4) There was less information in the images
풀이: 2번, 회선(컨볼루션)을 줄이다보니 정확도가 떨어졌다. (덜 캐치하게 된?!)
정말 쉽지 않은 주차였다.. ImageGenerator와 directory 개념이 잘 이해가 안되서 좀 헤메였다.
그래도 CNN에 대해 좀 더 배울 수 있었고, 영어 강의라고 쫄아서 번역기 돌리는 거보다 영어로 듣고 또 듣는 게 더 이해도 잘되고 빠르다는 걸 배울 수있었던 주차다.
과제 : 행복 , 슬픔 표정 구분하기
Course1을 마치며..
Congratulations! You've reached the end of course 1! You've come a long way from looking at the most basic of neural networks to building a basic computer vision neural network that classified clothing. You took this a little further by using Convolutions that spot features in an image, and then classify and learn based on those features. In course 2, you'll go a little deeper into Convolutions, learning how you can go into depth with real-world images, and learn many of the techniques used in challenges such as those run by Kaggle!