본문 바로가기

Artificial Intelligence/Tensorflow

[Tensorflow] 김치 이미지 분류기 - 모델학습

728x90

학습과 검증 데이터를 분류하였으니 이제 이미지 분류 모델을 만들어 보겠습니다. 모델 학습 절차는 다음과 같습니다.

 

  1. Sequential 모델 설계하기
  2. 만든 모델을 compile 하기
  3. 학습 데이터를 넣어 모델 학습하기

1번의 Sequential 모델을 만들 때 여러 가지의 다른 레이어들을 사용하게 됩니다. 사용되는 레이어들은 다음과 같습니다.

 

  • Conv2D: (크기 3 X 3의 16개의 필터) 이미지에서 특징이 추출됩니다.
  • MaxPooling2D: 이미지의 크기를 절반으로 줄입니다.
  • Flatten: 데이터를 1차원 배열의 형태로 변환합니다.
  • Relu: 값 x가 주어질 때 max(x, 0)을 반환하여 0 이하의 값을 모두 제거해줍니다. 데이터 손실이 크지만 학습이 빠르다는 장점이 있습니다.
  • Dense: 입력과 출력을 연결해주는 레이어입니다.

위에서 설명한 레이어들과 활성화 함수를 사용하여 모델을 설계합니다.

 

num_classes = len(class_names)

model = Sequential([
  layers.Conv2D(16, 3, padding='same', activation='relu', input_shape=(img_height, img_width, 3)),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(64, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])
model.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 150, 150, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 75, 75, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 75, 75, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 37, 37, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 37, 37, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 18, 18, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 20736)             0         
_________________________________________________________________
dense (Dense)                (None, 128)               2654336   
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1290      
=================================================================
Total params: 2,679,210
Trainable params: 2,679,210
Non-trainable params: 0
_________________________________________________________________

 

MaxPooling2D를 사용했을 때 출력을 모양을 보면 크기가 절반이 되는 것을 확인할 수 있고, 첫 번째 Flatten을 사용하였을 때 출력을 모양이 (18*18*64) = 20736이 되는 것처럼 모양이 변하는 것을 확인할 수 있습니다.

 

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

 

이제 설계한 모델을 compile을 진행할 텐데 adam 옵티마이저 및 SparseCategoricalCrossentropy 손실 함수를 사용하였습니다.

 

epochs=10

history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

 

모델 학습 과정은 오랜 시간이 걸리므로 충분한 시간이 있을 경우에만 실행시켜주시기 바랍니다. 미리 만들어두었던 학습 데이터와 검증 데이터를 넣어주고 epochs에 원하는 실행 횟수를 정의해주고 model.fit()을 실행시켜줍니다.

 

model.save("models")

 

model.save를 사용하여 학습시킨 모델을 저장해줍니다.

728x90