Curriculum/AI웹개발자_내일배움캠프

Story 8. 머신러닝 끝! 알고리즘 시작!

작은코딩 2022. 1. 11. 10:31
머신러닝

길고 길었던 머신러닝 강의를 완강했다!! 얻어간게 얼마나 될지는 모르겠지만 ㅎㅎ

(이론 너무 어려워 ㅠ)

 

전이학습으로 학습을 시킬 땐 파라미터와 데이터 수가 너무 커서 코랩 구글 gpu를 이용하게 되었는데 8시간짜리 학습을 시켰더니 구글이 학습이 완료되기 전에 gpu를 뺐어간다 ㅠㅠ 런타임 초기화라고 하는 무서운 괴물은 30시간 이상의 시간을 잡아먹고 좌절이란 단어를 내게 안겨주었다.

(추가로 코랩 전용 계정까지 만들어서 시도했지만 결국 포기 ㅠ)

 

솔직히 전 스토리에서 선형회귀 논리회귀 등 나름(?) 정리를 해봤지만 완전히 이해했다고는 보기 어려워서 코드를 자주 사용하면서 사고하는 힘을 길러야겠다. (이건 단기간에 배울 수 있는 학문이 아냐,,)

 

아래는 숙제 전이학습 시 사용된 코드! (구글이 불허한 실습 코드는 생략토록 한다)

 

(코드를 보려면 더보기를 클릭!)

더보기
# 코렙에서 작성한 코드!
import os
os.environ['KAGGLE_USERNAME'] = '' # username
os.environ['KAGGLE_KEY'] = '' # key

!kaggle datasets download -d puneet6060/intel-image-classification

!unzip -q intel-image-classification.zip

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
)

from pprint import pprint
pprint(train_gen.class_indices)

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'])

model.summary()

from tensorflow.keras.callbacks import ModelCheckpoint

history = model.fit(
    train_gen,
    validation_data=test_gen, # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs=20, # epochs 복수형으로 쓰기!
    callbacks=[
      ModelCheckpoint('4w_homework_model.h5', monitor='val_acc', verbose=1, save_best_only=True)
    ]
)

fig, axes = plt.subplots(1, 2, figsize=(20, 6))
axes[0].plot(history.history['loss'])
axes[0].plot(history.history['val_loss'])
axes[1].plot(history.history['acc'])
axes[1].plot(history.history['val_acc'])

from tensorflow.keras.models import load_model

model = load_model('4w_homework_model.h5')

print('Model loaded!')

test_imgs, test_labels = test_gen.__getitem__(0)

y_pred = model.predict(test_imgs)

classes = dict((v, k) for k, v in test_gen.class_indices.items())

fig, axes = plt.subplots(3, 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)

 


알고리즘

알고리즘 강의는 스파르타 내배캠 1주 차에 조금 들었었는데 숙제를 안해놨었다,,

소수 구하는 알고리즘과 간단한 퀴즈를 풀었는데 이런 쪽으로 생각을 안해봤어서 그런지 사고력이 굉장히 부족하다.

(두 문제를 푸는데만 반나절 이상을 투자했다,,)

 

아래는 알고리즘 숙제 코드!

(소수 구하기 코드를 보려면 더보기를 클릭!)

def find_prime_list_under_number(number):
    numbers = []
    prime = []
    for i in range(2, number+1):
        if i % 2 != 0:
            numbers.append(i)
        elif i == 2:
            numbers.append(i)
    print(numbers)

    for x in numbers:
        for a in range(2, round(x**(1/2))+1):
            if x % a == 0:
                break
        else:
            prime.append(x)
    return prime

input = 1000

result = find_prime_list_under_number(input)
print(result)

 

(퀴즈 코드를 보려면 더보기를 클릭!)

더보기

<퀴즈 개요>

Q. 문자열 뒤집기

0과 1로만 이루어진 문자열이 주어졌을 때, 이 문자열에 있는 모든 숫자를 전부 같게 만들려고 한다. 할 수 있는 행동은 문자열에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다. 예를 들어 S=0001100 일 때, 1번째 문자부터 3번째 문자까지 뒤집으면 1111100 이 되고, 6번째 문자부터 7번째 문자까지 뒤집으면 1111111이 돼서 2번 만에 모두 같은 숫자로 만들 수 있다. 하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다. 주어진 문자열을 모두 0 혹은 모두 1로 같게 만드는 최소 횟수를 반환하시오.

 

"0101100"

 

def find_count_to_turn_out_to_all_zero_or_all_one(string):
    input_list = []
    result_0 = 0
    result_1 = 0

    for s in string:
        input_list.append(int(s))

    if input_list[0] == 0:
        result_1 += 1
    elif input_list[0] == 1:
        result_0 += 1

    for i in range(len(input_list[1:])):
        if input_list[i] != input_list[i+1]:
            if input_list[i+1] == 1:
                result_0 += 1
            elif input_list[i+1] == 0:
                result_1 += 1

    print(f'0: {result_0}, 1: {result_1}')

    result = min(result_0, result_1)
    return result

input = "0101100"

result = find_count_to_turn_out_to_all_zero_or_all_one(input)
print(result)