본문 바로가기

카테고리 없음

이미지 분류 - CNN

전처리 과정을 통해 얻은 이미지(847 * 1200)들을 확인해보면 일부 이미지들은 작은 원본 크기로 인해 변환된 이미지에 아무 정보가 없는 검은 공간이 많지만 CNN 모델을 통해 이를 해결할 수 있다. 

모든 데이터들에 대한 모델을 생성하기 전 adenocarcinoma 와 normal 의 두 종류의 이미를 통해 adenocarcinoma 를 판별하는 모델을 먼저 생성

adenocarcinoma_test_ts_image = transpose_image(width, height, adenocarcinoma_test_image_list)
normal_test_ts_image = transpose_image(width, height, normal_test_image_list)
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape = (height, width,3)))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu', padding='same'))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(1))
model.summary()
>>>
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 874, 1200, 32)     896       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 437, 600, 32)     0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 437, 600, 64)      18496     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 218, 300, 64)     0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 4185600)           0         
                                                                 
 dense (Dense)               (None, 100)               418560100 
                                                                 
 dropout (Dropout)           (None, 100)               0         
                                                                 
 dense_1 (Dense)             (None, 1)                 101       
                                                                 
=================================================================
Total params: 418,579,593
Trainable params: 418,579,593
Non-trainable params: 0
_________________________________________________________________

 

너무 많은 파라미터의 확인, 커널의 개수를 조절해야 한다.

model2 = keras.Sequential()
model2.add(keras.layers.Conv2D(8, kernel_size=3, activation='relu', padding='same', input_shape = (height, width,3)))
model2.add(keras.layers.MaxPooling2D(2))
model2.add(keras.layers.Conv2D(16, kernel_size=3, activation='relu', padding='same'))
model2.add(keras.layers.MaxPooling2D(2))
model2.add(keras.layers.Flatten())
model2.add(keras.layers.Dense(20, activation='relu'))
model2.add(keras.layers.Dropout(0.4))
model2.add(keras.layers.Dense(1))
model2.sumamry()
>>>
Model: "sequential_3"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_6 (Conv2D)           (None, 874, 1200, 8)      224       
                                                                 
 max_pooling2d_6 (MaxPooling  (None, 437, 600, 8)      0         
 2D)                                                             
                                                                 
 conv2d_7 (Conv2D)           (None, 437, 600, 16)      1168      
                                                                 
 max_pooling2d_7 (MaxPooling  (None, 218, 300, 16)     0         
 2D)                                                             
                                                                 
 flatten_3 (Flatten)         (None, 1046400)           0         
                                                                 
 dense_6 (Dense)             (None, 20)                20928020  
                                                                 
 dropout_3 (Dropout)         (None, 20)                0         
                                                                 
 dense_7 (Dense)             (None, 1)                 21        
                                                                 
=================================================================
Total params: 20,929,433
Trainable params: 20,929,433
Non-trainable params: 0
_________________________________________________________________

dense_6의 하이퍼 파라미터의 개수가 1/20로 감소된 모습, 

history = model2.fit(train_scaled, train_target, epochs=10)
>>>
Epoch 1/10
11/11 [==============================] - 3s 257ms/step - loss: 0.0000e+00 - accuracy: 0.8426
Epoch 2/10
11/11 [==============================] - 3s 260ms/step - loss: 0.0000e+00 - accuracy: 0.8426
Epoch 3/10
11/11 [==============================] - 3s 258ms/step - loss: 0.0000e+00 - accuracy: 0.8542
Epoch 4/10
11/11 [==============================] - 3s 260ms/step - loss: 0.0000e+00 - accuracy: 0.8601
Epoch 5/10
11/11 [==============================] - 3s 259ms/step - loss: 0.0000e+00 - accuracy: 0.8571
Epoch 6/10
11/11 [==============================] - 3s 259ms/step - loss: 0.0000e+00 - accuracy: 0.8397
Epoch 7/10
11/11 [==============================] - 3s 260ms/step - loss: 0.0000e+00 - accuracy: 0.8397
Epoch 8/10
11/11 [==============================] - 3s 259ms/step - loss: 0.0000e+00 - accuracy: 0.8542
Epoch 9/10
11/11 [==============================] - 3s 261ms/step - loss: 0.0000e+00 - accuracy: 0.8892
Epoch 10/10
11/11 [==============================] - 3s 259ms/step - loss: 0.0000e+00 - accuracy: 0.8746

모델의 실행 결과, 정확도 확인

테스트 세트에서의 평가

model2.evaluate(test_scaled, test_target)
>>>
6/6 [==============================] - 2s 186ms/step - loss: 0.0000e+00 - accuracy: 0.9598
[0.0, 0.959770143032074]

 

테스트 세트에서 더 높은 점수를 보임, 모델을 더 훈련시킬 수 있을 것