본문 바로가기

인공지능/GAN 생성모델?

제 2장 딥러닝?

반응형

딥러닝의 정의

  • 딥러닝은 머신러닝 알고리즘의 한 종류입니다. 데이터 처리 유닛의 층을 여러 개 쌓아 구조적이지 않은 데이터로부터 고수준 표현을 학습합니다.

정형 데이터와 비정형 데이터

  • 많은 종류의 머신러닝 알고리즘은 정형 데이터인 테이블 형태를 입력으로 많이 사용한다. 이 데이터에서 각 샘플을 설명하는 특성이 열로 표현된다.
  • 비정형 데이터는 이미지, 소리, 텍스트 같이 태생적으로 특성의 열로 구성할 수 없는 데이터를 말한다.
  • 비정형 데이터인 픽셀, 진동수, 문자 하나하나는 거의 아무런 정보를 갖지 않는다.
  • 예를 들어서 243번째 픽셀이 황토색이라는 사실이 -> 이 이미지가 집인지 강아지인지 구별하는 데 전혀 도움이 안된다.

딥러닝의 진정한 의미

  • 비정형 데이터를 다룰 수 있다는 점이다. 특히 생성 모델링에서는 더욱 더 그렇다. 생성 모델링은 비정형 데이터를 생성해내는 것이 관심 대상이기 때문이다.

인공 신경망

케라스와 텐서플로우

  • 케라스는 신경망을 만들기 위한 고수준 파이썬 라이브러리이다.
  • 텐서플로우는 백엔드 프레임워크이다. (문서가 풍부함)
  • 딥러닝 분야에서 텐서 -> 데이터를 저장하고, 네트워크를 통해 전달되는 다차원 배열을 말한다.

첫 번째 심층 신경망

  • CIFAR-10 데이터셋을 사용해보자.
import numpy as np
from keras.utils import to_categorical
from keras.datasets import cifar10

(x_train, y_train), (x_test, y_test) = cifar10.load_data()


NUM_CLASS = 10

x_train = x_train.astype('float32') / 255.0
x_test = y_train.astype('float32') / 255.0

y_train = to_categorical(y_train, NUM_CLASS)
y_test = to_categorical(y_test, NUM_CLASS)

import matplotlib.pyplot as plt

plt.imshow(x_train[0])
plt.show()
  • 데이터의 형태를 보자.
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

모델 만들기

import tensorflow as tf

inputs = tf.keras.Input(shape=(32,32, 3))
x = tf.keras.layers.Flatten()(inputs)
x = tf.keras.layers.Dense(200, activation='relu')(x)
x = tf.keras.layers.Dense(150, activation='relu')(x)
predictions = tf.keras.layers.Dense(10, activation='softmax')(x)

model = tf.keras.Model(inputs, predictions)

model.summary()
  • 활성화 함수
  1. 렐루(ReLU) 함수 : 입력이 음수이면 0이고 그 외에는 입력과 동일한 값을 출력합니다.
  2. 리키렐루 함수 : 입력이 0보다 작으면 입력에 비례하는 작은 음수를 반환하고, 그 외에는 입력과 동일한 값을 출력합니다. (그레이디언트가 0이 되는 것을 방지하기 위한 좋은 전략)
  3. 시그모이드 함수 : 층의 출력을 0~1 사이로 조정하고 싶을 때 유용하다.
  4. 소프트맥스 함수 : 전체 출력 합이 1이 되어야 할 때 사용한다.

모델 컴파일 하기

from keras.optimizers import Adam

opt = Adam(lr=0.0005)
model.compile(
    loss = 'categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)
  • 가장 널리 사용하고 안정적인 옵티마이저 중 하나는 Adam이다.
  • 널리 사용하는 다른 옵티마이저는 RMSProp이다.

모델 훈련하기

model.fit(
    x_train,
    y_train,
    batch_size=32,
    epochs=10,
    shuffle=True
)

모델 평가하기

model.evaluate(x_test, y_test)

모델 평가하기2

CLASSES = np.array(['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship,', 'truck']
                  )
preds = model.predict(x_test)
preds_single = CLASSES[np.argmax(preds, axis=-1)]
actual_single = CLASSES[np.argmax(y_test, axis=-1)]

합성곱 층

  • 배치 정규화 층 : 심층 신경망을 훈련할 때 대표적으로 어려운 한 가지는 네트워크의 가중치를 일정한 범위 안에서 유지해야 한다는 것이다. 값이 커지기 시작한다면 네트워크에 그레이디언트 폭주 문제가 발생했다는 신호이다.

  • 그레이디언트 폭주 문제에 대한 근본적인 원인 : 신경망에 주입되는 입력 데이터를 스케일 조정하는 이유 중 하나는 처음 몇번의 반복 훈련을 안정적으로 시작하기 위해서이다.

  • 배치 정규화 층은 배치에 대해 각 입력 채널별로 평균과 표준 편차를 계산한 다음 평균을 빼고 표준 편차로 나누어 정규화한다.

  • 배치 정규화 층은 이전 층의 채널마다 스케일(gamma)와 이동(beta)을 위한 2개의 가중치가 학습되어야 한다.

  • 드롭 아웃 층 : 드롭아웃층은 이전 층의 유닛 일부를 랜덤하게 선택하여 출력을 0으로 만든다.

import tensorflow as tf

inputs = tf.keras.Input(shape=(32,32, 3))
x = tf.keras.layers.Conv2D(32, kernel_size = (3,3), strides=1, padding='same')(inputs)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU()(x)
x = tf.keras.layers.Conv2D(32, kernel_size = (3,3), strides=2, padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU()(x)
x = tf.keras.layers.Conv2D(64, kernel_size = (3,3), strides=1, padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU()(x)
x = tf.keras.layers.Conv2D(64, kernel_size = (3,3), strides=2, padding='same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU()(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(128)(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU()(x)
x = tf.keras.layers.Dropout(rate=0.5)(x)
predictions = tf.keras.layers.Dense(10, activation='softmax')(x)

model = tf.keras.Model(inputs, predictions)

model.summary()


model.compile(
    loss = 'categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

model.fit(x_train,y_train, batch_size =32, epochs=30, shuffle=True)
반응형

'인공지능 > GAN 생성모델?' 카테고리의 다른 글

GAN 공부  (1) 2023.10.30
제 1장 겐을 만들자  (1) 2023.10.27