CNN(시각 지능 딥러닝)-(2)

Gyeunggeun Lee·2023년 3월 27일
0

CNN

목록 보기
2/3

📰 Data Augmentation

데이터 증강(Data Augmentation)은 딥러닝에서 모델의 성능을 향상시키기 위해 사용되는 기법으로, 주어진 데이터를 변형하여 모델이 다양한 형태의 데이터에 대해 학습할 수 있도록 돕습니다. 데이터 증강은 과적합(overfitting)을 방지하고, 일반화(generalization) 성능을 향상시키는 데 도움이 됩니다.

이미지 데이터에 대한 일반적인 데이터 증강 기법은 다음과 같습니다:

1. 회전(Rotation)
2. 좌우 반전(Flip)
3. 확대/축소(Scaling)
4. 이동(Translation)
5. 명암 조절(Brightness)
6. 노이즈 추가(Noise)

예시 코드

💡 필요한 라이브러리를 가져오기

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator

💡 ImageDataGenerator 객체를 생성하여 데이터 증강 설정을 지정

datagen = ImageDataGenerator(
    rotation_range=15,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    fill_mode='nearest',
    brightness_range=[0.8, 1.2]
)

💡 설정된 데이터 증강 기법을 적용하려면, 아래와 같이 데이터를 불러오고 ImageDataGenerator 객체를 사용하여 변형된 데이터를 얻을 수 있다.

# 예시 이미지 불러오기
(x_train, y_train), (_, _) = tf.keras.datasets.cifar10.load_data()
x_train = x_train / 255.0
# 데이터 증강 생성
augmented_data = datagen.flow(x_train, y_train, batch_size=32)

💡 마지막으로, 모델 학습 과정에서 데이터 증강을 적용하려면 fit 대신 fit_generator 메소드를 사용

model = build_model()  # build_model() 함수는 사용자가 정의해야 하는 모델 생성 함수입니다.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 모델 학습
model.fit_generator(augmented_data, epochs=100, steps_per_epoch=len(x_train) // 32)

📰 Batch Normalization

배치 정규화(Batch Normalization)는 딥러닝 모델의 학습 속도를 높이고, 초기 가중치에 덜 민감하게 만들어주는 기법입니다. 이는 모델의 각 층에서 활성화 함수의 출력값 분포를 정규화하여 학습 과정이 더 원활하게 진행되도록 돕습니다. 배치 정규화는 과적합(overfitting)을 방지하는 데도 도움이 됩니다.

배치 정규화의 주요 아이디어는 각 층의 활성화 함수 출력값이 평균이 0이고 분산이 1인 정규화된 분포를 따르도록 조정하는 것입니다. 이는 다음 과정을 거쳐 이루어집니다.

1. 미니배치(mini-batch)의 평균 및 분산을 계산합니다.
2. 활성화 함수 출력값을 평균이 0이고 분산이 1인 값으로 정규화합니다.
3. 정규화된 값을 조정하여 활성화 함수 출력값의 분포를 원하는 형태로 만듭니다. 이때 조정에 사용되는 두 가지 파라미터(이동 및 크기 조정)는 학습 과정에서 최적화됩니다.

예시 코드

모델 불러오기

import tensorflow as tf
from tensorflow.keras.layers import BatchNormalization, Dense, Activation, Input
from tensorflow.keras.models import Model

Dense 레이어 다음에 BatchNormalization 레이어를 추가

input_layer = Input(shape=(784,))
# Dense 레이어
dense = Dense(units=128)(input_layer)
# 배치 정규화
batch_norm = BatchNormalization()(dense)
# 활성화 함수
activation = Activation('relu')(batch_norm)
# ... 다른 레이어들
# 모델 생성
model = Model(inputs=input_layer, outputs=activation)

이렇게 배치 정규화를 모델에 적용하면 학습 과정이 빠르고 안정적으로 진행됩니다.

📰 Generator의 역할

제너레이터(generator)는 Python에서 데이터를 생성하는 객체로, 일반적인 함수와 달리 실행 중인 상태를 유지하고 이어서 다시 실행할 수 있는 특별한 함수입니다. 제너레이터는 yield 키워드를 사용하여 값을 반환하며, 이를 통해 순차적으로 데이터를 생성합니다. 이러한 방식 덕분에 제너레이터는 큰 데이터셋을 처리할 때 메모리 사용량을 줄이는 데 도움이 됩니다.

컴퓨터 비전 및 딥러닝 분야에서 제너레이터는 주로 다음과 같은 목적으로 사용됩니다.

  • 메모리 효율성: 대용량 데이터셋을 다룰 때 모든 데이터를 메모리에 한 번에 로드하는 것이 불가능하거나 비효율적일 수 있습니다. 제너레이터는 데이터를 작은 배치로 나누어 처리할 수 있게 하여, 메모리 사용량을 줄이고 효율성을 높입니다.
  • 데이터 파이프라인: 제너레이터를 사용하면 데이터 전처리 및 증강 작업을 순차적으로 수행하면서 모델에 공급할 수 있습니다. 이렇게 함으로써 데이터 처리 과정을 간소화하고, 딥러닝 모델의 학습 및 예측 과정에 적용할 수 있습니다.
  • 실시간 처리: 제너레이터를 사용하면 실시간으로 생성되는 데이터를 지속적으로 처리하는 것이 가능합니다. 예를 들어, 웹 서버에서 수집되는 로그 데이터를 실시간으로 분석하는 경우 제너레이터가 유용할 수 있습니다.

    Keras와 같은 딥러닝 라이브러리에서는 데이터 제너레이터를 사용하여 이미지 데이터를 효율적으로 로드하고, 전처리 및 데이터 증강 작업을 수행한 후 모델에 전달하는 것이 가능합니다. 이를 통해 대용량 데이터셋을 처리하면서도 메모리 사용량을 최소화하고, 효율적인 학습 및 예측 과정을 구현할 수 있습니다.

📰 CNN 관련 코드

ImageDataGenerator

ImageDataGenerator는 기존 이미지 데이터가 부족한 상황에서 변환을 통해 이미지를 증강시키기 위한 목적으로 사용됩니다. 이를 통해 데이터 증강(Data Augmentation)을 수행하여 새로운 이미지를 생성할 수 있습니다.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

ModelCheckpoint

ModelCheckpoint는 Keras 모델 또는 모델 가중치를 특정 빈도로 저장하는 콜백입니다. 모델 학습 시 한 epoch 당 성능이 개선되면 저장하는 콜백이기 때문에 학습 과정 중에 자동으로 저장되는 모델 저장 방식을 사용할 수 있습니다.

mcp = ModelCheckpoint(filepath='/content/model1.h5',   # 모델 저장 경로
                      monitor='val_loss',              # 모델 저장의 관심 대상
                      verbose=1,                       # 진행상태 옵션; 어느 시점에서 저장되는지 알려줌
                      save_best_only=True,             # 최고 성능 모델만 저장
                      save_weights_only=False)         # 가중치만 저장할 것인지, 모델 구조도 저장할 것인지
history = model.fit(flow_trainIDG, epochs=10000, verbose=1,
                    validation_data=flow_valIDG,
                    callbacks=[es, mcp])

Model Save & Load

Model Save
마지막 에포크의 가중치와 모델 구조를 저장하는 방식입니다.

model.save('my_first_save.h5')

Model Load

clear_session()
model = keras.models.load_model('/content/model1.h5') # 파일에 있는 모델 불러오기
model.summary()

Load 후

pred_train = model.predict(train_x)
pred_test = model.predict(test_x)
single_pred_train = pred_train.argmax(axis=1)
single_pred_test = pred_test.argmax(axis=1)
logi_train_accuracy = accuracy_score(train_y.argmax(axis=1), single_pred_train)
logi_test_accuracy = accuracy_score(test_y.argmax(axis=1), single_pred_test)
print('CNN')
print(f'트레이닝 정확도 : {logi_train_accuracy*100:.2f}%')
print(f'테스트 정확도 : {logi_test_accuracy*100:.2f}%')

기타

데이터 수집 문제
1. 저작권

2. 데이터 수집량

→ 조금이라도 수집했다면?
⇒ Data Augmentation → Image Data Augmentation
왜 Image Data Augmentation를 했는가?
데이터를 수집해야 하는 상황에서 최대한 살려 사용하기 위해
But 완전히 새로운 이미지 및 feature가 만들어지진 않는다. 그럼에도 최대한 뽑아보자.

 image = np.expand_dims(image, axis=0) # 데이터 개수를 담당할 차원 추가

중요한 코드이다. 외워두자

profile
데이터 분석가, 데이터 사이언티스트 공부중인 이경근입니다

0개의 댓글