이번년도에 스마트해상물류 공모전을 참가하면서 스파르타코딩클럽 수강권 1장을 받게되어, 평소에 궁금하던 머신러닝을 수강하게 되었습니다.
대학생분들은 한이음 혹은 스마트해상물류 프로젝트를 진행하는거 추천드려요
(수많은 기프티콘, 프로젝트기회, 멘토들의 조언, 수강권 등 많은 혜택이 있습니다.)
머신러닝 3주차 과제를 위해서 티스토리에 글을 쓰게 되었습니다 !
3주차 과제는 혼자서 딥러닝으로 손글씨학습을 구현하는 문제입니다.
먼저 과제를 하기전에 저 처럼 머신러닝에 처음 접하신 분들도 있으실텐데요
TensorFlow라는 것은 들어봤어도 Colab은 이번에 처음 들어봤는데요
구글에서 Colab을 통해 python을 작성할 수 있습니다.
기존 데스크탑이나 노트북을 사용하면서 python을 이용하는데에 라이브러리파일하고 깔기 정말 귀찮았는데,
그 단점을 완벽하게 보완해준 tool입니다 !
CNN은 합성곱 신경망(Convolutional Neural Networks)이라고 합니다.
합성곱 신경망을 통해서 풍경사진을 분류해보는 시간을 가져보겠습니다.
import os
os.environ['KAGGLE_USERNAME'] = 'junhyeongrhee' # username
os.environ['KAGGLE_KEY'] = '11ddf21c53c4abd5bdadfd7d56a7891d' # key
먼저 kaggle의 유저네임과 키를 입력합니다.
!kaggle datasets download -d puneet6060/intel-image-classification
!unzip -q intel-image-classification.zip
그 다음 kaggle에서 풍경을 받고, 알집해제를 해줍니다.
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, Flatten, Dropout
from tensorflow.keras.optimizers import Adam, SGD
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
이번에 쓸 라이브러리 들입니다.
train_datagen = ImageDataGenerator(
rescale=1./255, # 일반화
rotation_range=10, # 랜덤하게 이미지를 회전 (단위: 도, 0-180)
zoom_range=0.1, # 랜덤하게 이미지 확대 (%)
width_shift_range=0.1, # 랜덤하게 이미지를 수평으로 이동 (%)
height_shift_range=0.1, # 랜덤하게 이미지를 수직으로 이동 (%)
horizontal_flip=True # 랜덤하게 이미지를 수평으로 뒤집기
)
test_datagen = ImageDataGenerator(
rescale=1./255 # 일반화
)
이미지를 랜덤하게 변경해주고, 일반화를 시켜줍니다.
train_gen = train_datagen.flow_from_directory(
'seg_train/seg_train',
target_size=(224, 224), # (height, width)
batch_size=32,
seed=2021,
class_mode='categorical',
shuffle=True
)
사진을 찾아줍니다.
test_gen = test_datagen.flow_from_directory(
'seg_test/seg_test',
target_size=(224, 224), # (height, width)
batch_size=32,
seed=2021,
class_mode='categorical',
shuffle=False
)
다시한번 찾아줍시다.
이번에는 14032개가 아닌 3000개가 떠서, 훨씬 줄었다는걸 확인할 수 있습니다.
preview_batch = train_gen.__getitem__(0)
preview_imgs, preview_labels = preview_batch
plt.title(str(preview_labels[0]))
plt.imshow(preview_imgs[0])
첫번째 사진 미리보기
이번에는 직접 학습을 시켜보겠습니다.
from tensorflow.keras.applications import ResNet50
input = Input(shape=(224, 224, 3))
base_model = ResNet50(weights='imagenet', include_top=False, input_tensor=input, pooling='max')
x = base_model.output
x = Dropout(rate=0.25)(x)
x = Dense(256, activation='relu')(x)
output = Dense(6, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=output)
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['acc'])
from tensorflow.keras.callbacks import ModelCheckpoint
history = model.fit(
train_gen,
validation_data=test_gen, # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
epochs=20, # epochs 복수형으로 쓰기!
callbacks=[
ModelCheckpoint('model.h5', monitor='val_acc', verbose=1, save_best_only=True)
]
)
이렇게 하면
학습이 되지만 17번째부터는 정확성 0.8582로부터 상승되지가 않는다고 뜨네요
(그리고 GPU로 학습해도 한번 학습할때 마다 6분이 넘습니다...)
(깨알 GPU로 학습하기)
colab 상단에 런타임에 들어가서 런타임유형변경에 들어간다음에, GPU로 설정하고 저장만 하면 됩니다.
그 다음 학습한 사진들을 불러볼께요
from tensorflow.keras.models import load_model
model = load_model('model.h5')
print('Model loaded!')
test_imgs, test_labels = test_gen.__getitem__(1)
y_pred = model.predict(test_imgs)
classes = dict((v, k) for k, v in test_gen.class_indices.items())
fig, axes = plt.subplots(4, 8, figsize=(20, 12))
for img, test_label, pred_label, ax in zip(test_imgs, test_labels, y_pred, axes.flatten()):
test_label = classes[np.argmax(test_label)]
pred_label = classes[np.argmax(pred_label)]
ax.set_title('GT:%s\nPR:%s' % (test_label, pred_label))
ax.imshow(img)
GT:buildings
PR:buildings, mountain, street, glacier, sea 이렇게 있네요
이렇게 머신러닝 강좌가 끝났습니다.
운이 좋게도 강좌를 7월달안에 다 들으니, 수강권하나와 CU기프트콘을 주시네요
이번에는 심화과정도 신청할 수 있어서, 프로그래밍의 꽃인 알고리즘으로 돌아오겠습니다 !
CUDA가 아닌 MPS로 MNIST학습 (0) | 2022.06.23 |
---|---|
딥러닝으로 손글씨 실습 (0) | 2021.07.20 |
Binary Logical Regression 구현 (0) | 2021.07.20 |
Linear Regression 구현 (0) | 2021.07.15 |
댓글 영역