반응형
딥러닝의 정의
- 딥러닝은 머신러닝 알고리즘의 한 종류입니다. 데이터 처리 유닛의 층을 여러 개 쌓아 구조적이지 않은 데이터로부터 고수준 표현을 학습합니다.
정형 데이터와 비정형 데이터
- 많은 종류의 머신러닝 알고리즘은 정형 데이터인 테이블 형태를 입력으로 많이 사용한다. 이 데이터에서 각 샘플을 설명하는 특성이 열로 표현된다.
- 비정형 데이터는 이미지, 소리, 텍스트 같이 태생적으로 특성의 열로 구성할 수 없는 데이터를 말한다.
- 비정형 데이터인 픽셀, 진동수, 문자 하나하나는 거의 아무런 정보를 갖지 않는다.
- 예를 들어서 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()
- 활성화 함수
- 렐루(ReLU) 함수 : 입력이 음수이면 0이고 그 외에는 입력과 동일한 값을 출력합니다.
- 리키렐루 함수 : 입력이 0보다 작으면 입력에 비례하는 작은 음수를 반환하고, 그 외에는 입력과 동일한 값을 출력합니다. (그레이디언트가 0이 되는 것을 방지하기 위한 좋은 전략)
- 시그모이드 함수 : 층의 출력을 0~1 사이로 조정하고 싶을 때 유용하다.
- 소프트맥스 함수 : 전체 출력 합이 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 |