인공지능과 딥러닝 모델의 설계 과정을 자동화하는 NAS 간단한 예제
목차
- Neural Architecture Search (NAS)는 딥러닝 모델의 아키텍처를 자동으로 탐색하는 방법입니다.
- TensorFlow 기반으로 간단한 NAS 예제를 구현할 수 있습니다.
- 이 예제에서는 tf.keras를 사용하여 기본적인 NAS를 구현하겠습니다.
NAS 간단한 예제 코드
- NAS의 복잡성을 고려해, 이 예제에서는 매우 간단한 CNN 모델을 탐색하는 방식을 보여드리겠습니다.
# 라이브러리 임포트
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
# 데이터셋 준비: 간단한 MNIST 데이터셋 사용
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)
# 탐색 공간 정의
def create_model(num_filters, kernel_size, dense_units):
model = models.Sequential()
model.add(layers.Conv2D(num_filters, kernel_size, activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(num_filters * 2, kernel_size, activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(dense_units, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
# 하이퍼파라미터 조합 탐색
num_filters_options = [32, 64]
kernel_size_options = [3, 5]
dense_units_options = [64, 128]
best_accuracy = 0
best_model = None
for num_filters in num_filters_options:
for kernel_size in kernel_size_options:
for dense_units in dense_units_options:
print(f"Training model with num_filters={num_filters}, kernel_size={kernel_size}, dense_units={dense_units}")
model = create_model(num_filters, kernel_size, dense_units)
model.fit(x_train, y_train, epochs=1, validation_data=(x_test, y_test), verbose=1)
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print(f"Test accuracy: {test_acc}")
if test_acc > best_accuracy:
best_accuracy = test_acc
best_model = model
print(f"Best model accuracy: {best_accuracy}")
라이브러리 임포트
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
- tensorflow와 numpy 라이브러리를 임포트합니다.
- 이 코드에서는 TensorFlow를 통해 딥러닝 모델을 구현하고, numpy를 사용해 데이터를 처리합니다.
데이터셋 준비: 간단한 MNIST 데이터셋 사용
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
- MNIST 데이터셋을 다운로드하고, 훈련 데이터(x_train, y_train)와 테스트 데이터(x_test, y_test)로 나눕니다.
x_train, x_test = x_train / 255.0, x_test / 255.0
- 픽셀 값을 0~1 사이로 정규화하여 모델이 더 빠르고 안정적으로 학습할 수 있도록 준비합니다.
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)
- 데이터에 차원을 추가하여 (28, 28) 크기의 이미지를 (28, 28, 1)로 만들어 CNN 모델에서 사용할 수 있게 합니다.
탐색 공간 정의
def create_model(num_filters, kernel_size, dense_units):
model = models.Sequential()
model.add(layers.Conv2D(num_filters, kernel_size, activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(num_filters * 2, kernel_size, activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(dense_units, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
def create_model(num_filters, kernel_size, dense_units):
- create_model 함수는 주어진 하이퍼파라미터로 CNN 모델을 생성합니다.
model = models.Sequential()
- Sequential 모델을 사용해 계층(layer)을 순차적으로 쌓습니다.
model.add(layers.Conv2D(num_filters, kernel_size, activation='relu', input_shape=(28, 28, 1)))
- 첫 번째 Conv2D 레이어를 추가합니다. 필터 수(num_filters), 커널 크기(kernel_size), ReLU 활성화 함수, 입력 형태를 지정합니다.
model.add(layers.MaxPooling2D((2, 2)))
- MaxPooling2D 레이어를 추가하여 특성 맵의 크기를 줄이고, 모델의 복잡도를 낮춥니다.
model.add(layers.Conv2D(num_filters * 2, kernel_size, activation='relu'))
- 두 번째 Conv2D 레이어를 추가합니다. 이전보다 필터 수를 두 배로 늘려 더 복잡한 특성을 추출합니다.
model.add(layers.MaxPooling2D((2, 2)))
- 다시 MaxPooling2D 레이어를 추가해 특성 맵 크기를 더 줄입니다.
model.add(layers.Flatten())
- Flatten 레이어를 사용해 2D 특성 맵을 1D 벡터로 펼칩니다. 이는 Dense 레이어에 연결하기 위함입니다.
model.add(layers.Dense(dense_units, activation='relu'))
- 첫 번째 Dense 레이어를 추가합니다. 여기서 유닛 수(dense_units)와 ReLU 활성화 함수를 지정합니다.
model.add(layers.Dense(10, activation='softmax'))
- 출력 레이어를 추가합니다. MNIST의 10개 클래스에 대한 확률을 출력하도록 softmax 활성화 함수를 사용합니다.
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
- 모델을 컴파일합니다. adam 옵티마이저와 sparse_categorical_crossentropy 손실 함수를 사용하며, 평가 지표로 정확도를 사용합니다.
return model
- 생성된 모델을 반환합니다.
하이퍼파라미터 조합 탐색
num_filters_options = [32, 64]
kernel_size_options = [3, 5]
dense_units_options = [64, 128]
best_accuracy = 0
best_model = None
for num_filters in num_filters_options:
for kernel_size in kernel_size_options:
for dense_units in dense_units_options:
print(f"Training model with num_filters={num_filters}, kernel_size={kernel_size}, dense_units={dense_units}")
model = create_model(num_filters, kernel_size, dense_units)
model.fit(x_train, y_train, epochs=1, validation_data=(x_test, y_test), verbose=1)
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print(f"Test accuracy: {test_acc}")
if test_acc > best_accuracy:
best_accuracy = test_acc
best_model = model
print(f"Best model accuracy: {best_accuracy}")
num_filters_options = [32, 64]
kernel_size_options = [3, 5]
dense_units_options = [64, 128]
- 하이퍼파라미터 탐색을 위해 사용할 필터 수, 커널 크기, Dense 유닛 수의 옵션을 정의합니다.
best_accuracy = 0
best_model = None
- 최고 정확도와 최적의 모델을 추적하기 위해 변수를 초기화합니다.
for num_filters in num_filters_options:
for kernel_size in kernel_size_options:
for dense_units in dense_units_options:
- 각 하이퍼파라미터 조합에 대해 반복문을 돌며 모델을 학습합니다.
print(f"Training model with num_filters={num_filters}, kernel_size={kernel_size}, dense_units={dense_units}")
- 현재 학습 중인 모델의 하이퍼파라미터 조합을 출력합니다.
model = create_model(num_filters, kernel_size, dense_units)
- 주어진 하이퍼파라미터로 모델을 생성합니다.
model.fit(x_train, y_train, epochs=1, validation_data=(x_test, y_test), verbose=1)
- 모델을 훈련시킵니다. 여기서는 에포크 수를 1로 설정하여 빠르게 결과를 확인합니다.
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
- 테스트 데이터로 모델을 평가하여 정확도를 계산합니다.
print(f"Test accuracy: {test_acc}")
- 테스트 정확도를 출력합니다.
if test_acc > best_accuracy:
best_accuracy = test_acc
best_model = model
- 현재 모델의 정확도가 이전까지의 최고 정확도보다 높으면, 최고 정확도를 업데이트하고 현재 모델을 최적 모델로 저장합니다.
print(f"Best model accuracy: {best_accuracy}")
- 탐색이 끝난 후, 가장 높은 정확도를 기록한 모델의 정확도를 출력합니다.
'개발 > AI' 카테고리의 다른 글
[AI] ResNet 요약정리 (0) | 2024.09.01 |
---|---|
[AI] ChatGPT의 딥러닝 모델 Transformer 요약 (0) | 2024.08.27 |
[AI] 인공지능 모델 설계 자동화를 위한 NAS (0) | 2024.08.12 |
Python과 Tensorflow를 이용하여 구현한 LSTM 활용하기 (2) | 2024.07.13 |
Python과 Tensorflow를 이용하여 LSTM 구현하기 (2) | 2024.07.13 |