본문 바로가기
개발/AI

[AI] 인공지능 모델 설계 자동화를 위한 NAS 간단한 예제

by 꾀돌이 개발자 2024. 8. 26.
반응형

 

인공지능과 딥러닝 모델의 설계 과정을 자동화하는 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}")

    - 탐색이 끝난 후, 가장 높은 정확도를 기록한 모델의 정확도를 출력합니다.

     

    반응형