Diary of Chanjun 데이터 분석가의 다이어리

CNN에 관하여

학습목적

이미지 데이터를 처리하고 학습하는 딥러닝 모델 중 CNN을 공부하고 오픈 이미지 데이터를 가지고 한 스텝 한 스텝 따라가본다.

CNN이란?

Convolutional Neural Network의 약자로 주로 이미지나 영상 데이터를 처리하기 위한 딥러닝 알고리즘 중 하나이다.
Flatten한 데이터를 처리하는 Fully Connected Neural Network와 다르게 이미지의 공간 정보 데이터를 유지하여 이미지를 인식할 수 있도록 만든다.
이를 위해서 Filter, Pooling, Padding, Stride 등의 개념들이 사용되며, 천천히 알아가보도록 하겠습니다.

출처/참고자료 : http://taewan.kim/post/cnn/

간단한 이미지를 참고해서 가져오겠습니다. 출처는 http://taewan.kim/post/cnn/ 입니다.
사람은 간단하게 2라고 보이는 것을 알 수 있지만, 컴퓨터 혹은 딥러닝으로 학습시키기에는 이렇게만 정보가 있어서는 안됩니다.
Oops

그래서 위와 같이 숫자로 이루어진 바둑판 모양으로 변환을 하게됩니다.
Oops

그리고 각 위치별 특성을 보기 위하여 filter라는 어떠한 판을 만들어 그것을 곱하여 특성으로 사용되게 됩니다.
Oops

참고 그림이 잠깐 달라지지만, 결국 아래와 같은 Feature map을 만들 수 있습니다.
여기서는 [[1, 0, 1], [0, 1, 0], [1, 0, 1]] 이렇게 생긴 filter를 사용했네요.
Oops

Filter에 대한 값은 Keras layer initializers에서 확인하실 수 있습니다.
다양하게 초기화시킬 수 있지만, 이 파라미터를 크게 바꾸는 경우나 바꿔서 크게 성능이 좋아지는 경우는 아직 확인하지 못했습니다.

이러한 Convolution과 filter의 개념을 사용하여 아래와 같은 그림으로 CNN이 이루어지게 됩니다.
Oops

출처/참고자료 : http://taewan.kim/post/cnn/
출처/참고자료 : https://youngq.tistory.com/40

그럼 이제 위에서 나오는 channel, Pooling, padding, Stride 등의 용어에 대해서 정리해보겠습니다.


이 외에도 loss function, Optimizer, Activate function 등 아직 배워야할 것이 많기 때문에 일단 기본적인 분류 예제를 만든 후 개념에 대해서는 각각 캡터를 만들어보도록 하겠습니다.


Library Import

import os
import sys
import warnings
from glob import glob
from tqdm import tqdm

import numpy as np
import pandas as pd

import tensorflow as tf

import matplotlib as mpl
import matplotlib.pyplot as plt

import cv2
%matplotlib inline
warnings.filterwarnings("ignore")

저는 python 3.8 버젼과 tensorflow 2.5 버젼을 사용하겠습니다.

!python --version
Python 3.8.10
tf.__version__
'2.5.0'

1. 데이터 탐색 및 구축과 이미지 데이터 다루기

오픈 데이터셋을 제공해주는 AI HUB에서 한국 음식 데이터를 받아서 실습을 해보겠습니다.

출처 : https://aihub.or.kr/aidata/13594

많은 종류가 있지만 구이 카테고리를 분류해보도록 하겠습니다.
file_list = pd.DataFrame(glob("data/kfood/구이/*/*"), columns = ["dir_name"])
file_list
dir_name
0 data/kfood/구이\갈비구이\crop_area.properties
1 data/kfood/구이\갈비구이\Img_000_0000.jpg
2 data/kfood/구이\갈비구이\Img_000_0001.jpg
3 data/kfood/구이\갈비구이\Img_000_0002.jpg
4 data/kfood/구이\갈비구이\Img_000_0003.jpg
... ...
14024 data/kfood/구이\훈제오리\Img_013_0997.jpg
14025 data/kfood/구이\훈제오리\Img_013_0998.jpg
14026 data/kfood/구이\훈제오리\Img_013_0999.jpg
14027 data/kfood/구이\훈제오리\Img_013_1000.jpg
14028 data/kfood/구이\훈제오리\org_url.csv

14029 rows × 1 columns

file_list.dir_name = file_list.dir_name.str.replace(pat = "\\", repl = "/")
file_list["category"] = file_list.dir_name.str.replace(pat = ".*/.*/.*/(.*)/(.*)(\.*)", repl = "\\1", regex = True)
file_list["file_name"] = file_list.dir_name.str.replace(pat = ".*/.*/.*/(.*)/(.*)(\.*)", repl = "\\2", regex = True)
file_list["ext_name"] = file_list.dir_name.str.replace(pat = ".*/.*/.*/(.*)/(.*)\.(.*)", repl = "\\3", regex = True)
file_list = file_list[file_list.ext_name.isin(["JPG", "jpg"])]
file_list
dir_name category file_name ext_name
1 data/kfood/구이/갈비구이/Img_000_0000.jpg 갈비구이 Img_000_0000.jpg jpg
2 data/kfood/구이/갈비구이/Img_000_0001.jpg 갈비구이 Img_000_0001.jpg jpg
3 data/kfood/구이/갈비구이/Img_000_0002.jpg 갈비구이 Img_000_0002.jpg jpg
4 data/kfood/구이/갈비구이/Img_000_0003.jpg 갈비구이 Img_000_0003.jpg jpg
5 data/kfood/구이/갈비구이/Img_000_0004.jpg 갈비구이 Img_000_0004.jpg jpg
... ... ... ... ...
14023 data/kfood/구이/훈제오리/Img_013_0996.jpg 훈제오리 Img_013_0996.jpg jpg
14024 data/kfood/구이/훈제오리/Img_013_0997.jpg 훈제오리 Img_013_0997.jpg jpg
14025 data/kfood/구이/훈제오리/Img_013_0998.jpg 훈제오리 Img_013_0998.jpg jpg
14026 data/kfood/구이/훈제오리/Img_013_0999.jpg 훈제오리 Img_013_0999.jpg jpg
14027 data/kfood/구이/훈제오리/Img_013_1000.jpg 훈제오리 Img_013_1000.jpg jpg

13964 rows × 4 columns

file_list.reset_index(drop = True, inplace = True)
file_list.groupby("category").file_name.count()
category
갈비구이      998
갈치구이      998
고등어구이    1000
곱창구이     1000
닭갈비       996
더덕구이     1000
떡갈비       997
불고기       997
삼겹살       992
장어구이      997
조개구이     1000
조기구이     1000
황태구이      997
훈제오리      992
Name: file_name, dtype: int64
file_list = file_list[file_list.category.isin(["삼겹살", "갈비구이", "곱창구이", "장어구이", "불고기", "조개구이"])]
print(len(file_list))
print(file_list.category.unique())
5984
['갈비구이' '곱창구이' '불고기' '삼겹살' '장어구이' '조개구이']

한글 경로가 있을 때 opencv가 이미지를 읽지 못하는 현상 발생 시 참고자료: (https://zzdd1558.tistory.com/228)[https://zzdd1558.tistory.com/228]

OPENCV를 jupyter에서 시각화하기 위한 참고자료 : https://stackoverflow.com/questions/46236180/opencv-imshow-will-cause-jupyter-notebook-crash

def cv2_filereader(filePath) : 
    stream = open(filePath.encode("utf-8"), "rb") 
    bytes = bytearray(stream.read())
    numpyArray = np.asarray(bytes, dtype=np.uint8) 
    return cv2.imdecode(numpyArray , cv2.IMREAD_COLOR)
img = cv2_filereader(file_list.dir_name[0])
img.shape
(600, 900, 3)
plt.imshow(img)
plt.show()

png

Oops

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

png

Oops

def show_image(dirs) :
    img = cv2_filereader(dirs)
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.show()
show_image(file_list.dir_name[0])

png

Oops

cv2_filereader("data/kfood/구이/갈비구이/Img_000_0145.jpg").shape[0]
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-2-cb57bb692161> in <module>
----> 1 cv2_filereader("data/kfood/구이/갈비구이/Img_000_0145.jpg").shape[0]


NameError: name 'cv2_filereader' is not defined

각각의 이미지 크기를 확인해보도록 한다.

def file_valid_chk(x) :
    try :
        cv2_filereader(x).shape[0]
        return 1
    except :
        return 0
file_list["valid"] = [file_valid_chk(x) for x in tqdm(file_list.dir_name)]
file_list.valid.value_counts()
100%|█████████████████████████████████████████████████████████████████████████| 5984/5984 [00:28<00:00, 207.94it/s]





1    5972
0      12
Name: valid, dtype: int64
file_list = file_list[file_list.valid == 1]
file_list["shapes"] = [cv2_filereader(x).shape[:2] for x in tqdm(file_list.dir_name)]
file_list["dimensions"] = [cv2_filereader(x).shape[2] for x in tqdm(file_list.dir_name)]
file_list
100%|█████████████████████████████████████████████████████████████████████████| 5972/5972 [00:27<00:00, 219.15it/s]
100%|█████████████████████████████████████████████████████████████████████████| 5972/5972 [00:27<00:00, 215.28it/s]
dir_name category file_name ext_name valid shapes dimensions
0 data/kfood/구이/갈비구이/Img_000_0000.jpg 갈비구이 Img_000_0000.jpg jpg 1 (600, 900) 3
1 data/kfood/구이/갈비구이/Img_000_0001.jpg 갈비구이 Img_000_0001.jpg jpg 1 (480, 640) 3
2 data/kfood/구이/갈비구이/Img_000_0002.jpg 갈비구이 Img_000_0002.jpg jpg 1 (600, 900) 3
3 data/kfood/구이/갈비구이/Img_000_0003.jpg 갈비구이 Img_000_0003.jpg jpg 1 (336, 600) 3
4 data/kfood/구이/갈비구이/Img_000_0004.jpg 갈비구이 Img_000_0004.jpg jpg 1 (705, 470) 3
... ... ... ... ... ... ... ...
10970 data/kfood/구이/조개구이/Img_010_0995.jpg 조개구이 Img_010_0995.jpg jpg 1 (400, 394) 3
10971 data/kfood/구이/조개구이/Img_010_0996.jpg 조개구이 Img_010_0996.jpg jpg 1 (400, 711) 3
10972 data/kfood/구이/조개구이/Img_010_0997.jpg 조개구이 Img_010_0997.jpg jpg 1 (400, 525) 3
10973 data/kfood/구이/조개구이/Img_010_0998.jpg 조개구이 Img_010_0998.jpg jpg 1 (400, 601) 3
10974 data/kfood/구이/조개구이/Img_010_0999.jpg 조개구이 Img_010_0999.jpg jpg 1 (400, 602) 3

5972 rows × 7 columns

file_list.dimensions.value_counts()
3    5972
Name: dimensions, dtype: int64
file_list.shapes.nunique()
936
file_list.category.nunique()
6
file_list.category.value_counts()
조개구이    1000
곱창구이    1000
불고기      995
장어구이     995
갈비구이     994
삼겹살      988
Name: category, dtype: int64

2. 모델 구축

from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras.layers import Dense, Input, Activation
model = EfficientNetB0(include_top=True, weights=None, input_tensor = Input(shape = (124, 124, 3)), classes = 6)
from tensorflow.keras.utils import plot_model
plot_model(model, to_file= "model_png/efficent_net_B0.png")

png

Oops

model.summary()
Model: "efficientnetb0"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 124, 124, 3) 0                                            
__________________________________________________________________________________________________
rescaling (Rescaling)           (None, 124, 124, 3)  0           input_1[0][0]                    
__________________________________________________________________________________________________
normalization (Normalization)   (None, 124, 124, 3)  7           rescaling[0][0]                  
__________________________________________________________________________________________________
stem_conv_pad (ZeroPadding2D)   (None, 125, 125, 3)  0           normalization[0][0]              
__________________________________________________________________________________________________
stem_conv (Conv2D)              (None, 62, 62, 32)   864         stem_conv_pad[0][0]              
__________________________________________________________________________________________________
stem_bn (BatchNormalization)    (None, 62, 62, 32)   128         stem_conv[0][0]                  
__________________________________________________________________________________________________
stem_activation (Activation)    (None, 62, 62, 32)   0           stem_bn[0][0]                    
__________________________________________________________________________________________________
block1a_dwconv (DepthwiseConv2D (None, 62, 62, 32)   288         stem_activation[0][0]            
__________________________________________________________________________________________________
block1a_bn (BatchNormalization) (None, 62, 62, 32)   128         block1a_dwconv[0][0]             
__________________________________________________________________________________________________
block1a_activation (Activation) (None, 62, 62, 32)   0           block1a_bn[0][0]                 
__________________________________________________________________________________________________
block1a_se_squeeze (GlobalAvera (None, 32)           0           block1a_activation[0][0]         
__________________________________________________________________________________________________
block1a_se_reshape (Reshape)    (None, 1, 1, 32)     0           block1a_se_squeeze[0][0]         
__________________________________________________________________________________________________
block1a_se_reduce (Conv2D)      (None, 1, 1, 8)      264         block1a_se_reshape[0][0]         
__________________________________________________________________________________________________
block1a_se_expand (Conv2D)      (None, 1, 1, 32)     288         block1a_se_reduce[0][0]          
__________________________________________________________________________________________________
block1a_se_excite (Multiply)    (None, 62, 62, 32)   0           block1a_activation[0][0]         
                                                                 block1a_se_expand[0][0]          
__________________________________________________________________________________________________
block1a_project_conv (Conv2D)   (None, 62, 62, 16)   512         block1a_se_excite[0][0]          
__________________________________________________________________________________________________
block1a_project_bn (BatchNormal (None, 62, 62, 16)   64          block1a_project_conv[0][0]       
__________________________________________________________________________________________________
block2a_expand_conv (Conv2D)    (None, 62, 62, 96)   1536        block1a_project_bn[0][0]         
__________________________________________________________________________________________________
block2a_expand_bn (BatchNormali (None, 62, 62, 96)   384         block2a_expand_conv[0][0]        
__________________________________________________________________________________________________
block2a_expand_activation (Acti (None, 62, 62, 96)   0           block2a_expand_bn[0][0]          
__________________________________________________________________________________________________
block2a_dwconv_pad (ZeroPadding (None, 63, 63, 96)   0           block2a_expand_activation[0][0]  
__________________________________________________________________________________________________
block2a_dwconv (DepthwiseConv2D (None, 31, 31, 96)   864         block2a_dwconv_pad[0][0]         
__________________________________________________________________________________________________
block2a_bn (BatchNormalization) (None, 31, 31, 96)   384         block2a_dwconv[0][0]             
__________________________________________________________________________________________________
block2a_activation (Activation) (None, 31, 31, 96)   0           block2a_bn[0][0]                 
__________________________________________________________________________________________________
block2a_se_squeeze (GlobalAvera (None, 96)           0           block2a_activation[0][0]         
__________________________________________________________________________________________________
block2a_se_reshape (Reshape)    (None, 1, 1, 96)     0           block2a_se_squeeze[0][0]         
__________________________________________________________________________________________________
block2a_se_reduce (Conv2D)      (None, 1, 1, 4)      388         block2a_se_reshape[0][0]         
__________________________________________________________________________________________________
block2a_se_expand (Conv2D)      (None, 1, 1, 96)     480         block2a_se_reduce[0][0]          
__________________________________________________________________________________________________
block2a_se_excite (Multiply)    (None, 31, 31, 96)   0           block2a_activation[0][0]         
                                                                 block2a_se_expand[0][0]          
__________________________________________________________________________________________________
block2a_project_conv (Conv2D)   (None, 31, 31, 24)   2304        block2a_se_excite[0][0]          
__________________________________________________________________________________________________
block2a_project_bn (BatchNormal (None, 31, 31, 24)   96          block2a_project_conv[0][0]       
__________________________________________________________________________________________________
block2b_expand_conv (Conv2D)    (None, 31, 31, 144)  3456        block2a_project_bn[0][0]         
__________________________________________________________________________________________________
block2b_expand_bn (BatchNormali (None, 31, 31, 144)  576         block2b_expand_conv[0][0]        
__________________________________________________________________________________________________
block2b_expand_activation (Acti (None, 31, 31, 144)  0           block2b_expand_bn[0][0]          
__________________________________________________________________________________________________
block2b_dwconv (DepthwiseConv2D (None, 31, 31, 144)  1296        block2b_expand_activation[0][0]  
__________________________________________________________________________________________________
block2b_bn (BatchNormalization) (None, 31, 31, 144)  576         block2b_dwconv[0][0]             
__________________________________________________________________________________________________
block2b_activation (Activation) (None, 31, 31, 144)  0           block2b_bn[0][0]                 
__________________________________________________________________________________________________
block2b_se_squeeze (GlobalAvera (None, 144)          0           block2b_activation[0][0]         
__________________________________________________________________________________________________
block2b_se_reshape (Reshape)    (None, 1, 1, 144)    0           block2b_se_squeeze[0][0]         
__________________________________________________________________________________________________
block2b_se_reduce (Conv2D)      (None, 1, 1, 6)      870         block2b_se_reshape[0][0]         
__________________________________________________________________________________________________
block2b_se_expand (Conv2D)      (None, 1, 1, 144)    1008        block2b_se_reduce[0][0]          
__________________________________________________________________________________________________
block2b_se_excite (Multiply)    (None, 31, 31, 144)  0           block2b_activation[0][0]         
                                                                 block2b_se_expand[0][0]          
__________________________________________________________________________________________________
block2b_project_conv (Conv2D)   (None, 31, 31, 24)   3456        block2b_se_excite[0][0]          
__________________________________________________________________________________________________
block2b_project_bn (BatchNormal (None, 31, 31, 24)   96          block2b_project_conv[0][0]       
__________________________________________________________________________________________________
block2b_drop (Dropout)          (None, 31, 31, 24)   0           block2b_project_bn[0][0]         
__________________________________________________________________________________________________
block2b_add (Add)               (None, 31, 31, 24)   0           block2b_drop[0][0]               
                                                                 block2a_project_bn[0][0]         
__________________________________________________________________________________________________
block3a_expand_conv (Conv2D)    (None, 31, 31, 144)  3456        block2b_add[0][0]                
__________________________________________________________________________________________________
block3a_expand_bn (BatchNormali (None, 31, 31, 144)  576         block3a_expand_conv[0][0]        
__________________________________________________________________________________________________
block3a_expand_activation (Acti (None, 31, 31, 144)  0           block3a_expand_bn[0][0]          
__________________________________________________________________________________________________
block3a_dwconv_pad (ZeroPadding (None, 35, 35, 144)  0           block3a_expand_activation[0][0]  
__________________________________________________________________________________________________
block3a_dwconv (DepthwiseConv2D (None, 16, 16, 144)  3600        block3a_dwconv_pad[0][0]         
__________________________________________________________________________________________________
block3a_bn (BatchNormalization) (None, 16, 16, 144)  576         block3a_dwconv[0][0]             
__________________________________________________________________________________________________
block3a_activation (Activation) (None, 16, 16, 144)  0           block3a_bn[0][0]                 
__________________________________________________________________________________________________
block3a_se_squeeze (GlobalAvera (None, 144)          0           block3a_activation[0][0]         
__________________________________________________________________________________________________
block3a_se_reshape (Reshape)    (None, 1, 1, 144)    0           block3a_se_squeeze[0][0]         
__________________________________________________________________________________________________
block3a_se_reduce (Conv2D)      (None, 1, 1, 6)      870         block3a_se_reshape[0][0]         
__________________________________________________________________________________________________
block3a_se_expand (Conv2D)      (None, 1, 1, 144)    1008        block3a_se_reduce[0][0]          
__________________________________________________________________________________________________
block3a_se_excite (Multiply)    (None, 16, 16, 144)  0           block3a_activation[0][0]         
                                                                 block3a_se_expand[0][0]          
__________________________________________________________________________________________________
block3a_project_conv (Conv2D)   (None, 16, 16, 40)   5760        block3a_se_excite[0][0]          
__________________________________________________________________________________________________
block3a_project_bn (BatchNormal (None, 16, 16, 40)   160         block3a_project_conv[0][0]       
__________________________________________________________________________________________________
block3b_expand_conv (Conv2D)    (None, 16, 16, 240)  9600        block3a_project_bn[0][0]         
__________________________________________________________________________________________________
block3b_expand_bn (BatchNormali (None, 16, 16, 240)  960         block3b_expand_conv[0][0]        
__________________________________________________________________________________________________
block3b_expand_activation (Acti (None, 16, 16, 240)  0           block3b_expand_bn[0][0]          
__________________________________________________________________________________________________
block3b_dwconv (DepthwiseConv2D (None, 16, 16, 240)  6000        block3b_expand_activation[0][0]  
__________________________________________________________________________________________________
block3b_bn (BatchNormalization) (None, 16, 16, 240)  960         block3b_dwconv[0][0]             
__________________________________________________________________________________________________
block3b_activation (Activation) (None, 16, 16, 240)  0           block3b_bn[0][0]                 
__________________________________________________________________________________________________
block3b_se_squeeze (GlobalAvera (None, 240)          0           block3b_activation[0][0]         
__________________________________________________________________________________________________
block3b_se_reshape (Reshape)    (None, 1, 1, 240)    0           block3b_se_squeeze[0][0]         
__________________________________________________________________________________________________
block3b_se_reduce (Conv2D)      (None, 1, 1, 10)     2410        block3b_se_reshape[0][0]         
__________________________________________________________________________________________________
block3b_se_expand (Conv2D)      (None, 1, 1, 240)    2640        block3b_se_reduce[0][0]          
__________________________________________________________________________________________________
block3b_se_excite (Multiply)    (None, 16, 16, 240)  0           block3b_activation[0][0]         
                                                                 block3b_se_expand[0][0]          
__________________________________________________________________________________________________
block3b_project_conv (Conv2D)   (None, 16, 16, 40)   9600        block3b_se_excite[0][0]          
__________________________________________________________________________________________________
block3b_project_bn (BatchNormal (None, 16, 16, 40)   160         block3b_project_conv[0][0]       
__________________________________________________________________________________________________
block3b_drop (Dropout)          (None, 16, 16, 40)   0           block3b_project_bn[0][0]         
__________________________________________________________________________________________________
block3b_add (Add)               (None, 16, 16, 40)   0           block3b_drop[0][0]               
                                                                 block3a_project_bn[0][0]         
__________________________________________________________________________________________________
block4a_expand_conv (Conv2D)    (None, 16, 16, 240)  9600        block3b_add[0][0]                
__________________________________________________________________________________________________
block4a_expand_bn (BatchNormali (None, 16, 16, 240)  960         block4a_expand_conv[0][0]        
__________________________________________________________________________________________________
block4a_expand_activation (Acti (None, 16, 16, 240)  0           block4a_expand_bn[0][0]          
__________________________________________________________________________________________________
block4a_dwconv_pad (ZeroPadding (None, 17, 17, 240)  0           block4a_expand_activation[0][0]  
__________________________________________________________________________________________________
block4a_dwconv (DepthwiseConv2D (None, 8, 8, 240)    2160        block4a_dwconv_pad[0][0]         
__________________________________________________________________________________________________
block4a_bn (BatchNormalization) (None, 8, 8, 240)    960         block4a_dwconv[0][0]             
__________________________________________________________________________________________________
block4a_activation (Activation) (None, 8, 8, 240)    0           block4a_bn[0][0]                 
__________________________________________________________________________________________________
block4a_se_squeeze (GlobalAvera (None, 240)          0           block4a_activation[0][0]         
__________________________________________________________________________________________________
block4a_se_reshape (Reshape)    (None, 1, 1, 240)    0           block4a_se_squeeze[0][0]         
__________________________________________________________________________________________________
block4a_se_reduce (Conv2D)      (None, 1, 1, 10)     2410        block4a_se_reshape[0][0]         
__________________________________________________________________________________________________
block4a_se_expand (Conv2D)      (None, 1, 1, 240)    2640        block4a_se_reduce[0][0]          
__________________________________________________________________________________________________
block4a_se_excite (Multiply)    (None, 8, 8, 240)    0           block4a_activation[0][0]         
                                                                 block4a_se_expand[0][0]          
__________________________________________________________________________________________________
block4a_project_conv (Conv2D)   (None, 8, 8, 80)     19200       block4a_se_excite[0][0]          
__________________________________________________________________________________________________
block4a_project_bn (BatchNormal (None, 8, 8, 80)     320         block4a_project_conv[0][0]       
__________________________________________________________________________________________________
block4b_expand_conv (Conv2D)    (None, 8, 8, 480)    38400       block4a_project_bn[0][0]         
__________________________________________________________________________________________________
block4b_expand_bn (BatchNormali (None, 8, 8, 480)    1920        block4b_expand_conv[0][0]        
__________________________________________________________________________________________________
block4b_expand_activation (Acti (None, 8, 8, 480)    0           block4b_expand_bn[0][0]          
__________________________________________________________________________________________________
block4b_dwconv (DepthwiseConv2D (None, 8, 8, 480)    4320        block4b_expand_activation[0][0]  
__________________________________________________________________________________________________
block4b_bn (BatchNormalization) (None, 8, 8, 480)    1920        block4b_dwconv[0][0]             
__________________________________________________________________________________________________
block4b_activation (Activation) (None, 8, 8, 480)    0           block4b_bn[0][0]                 
__________________________________________________________________________________________________
block4b_se_squeeze (GlobalAvera (None, 480)          0           block4b_activation[0][0]         
__________________________________________________________________________________________________
block4b_se_reshape (Reshape)    (None, 1, 1, 480)    0           block4b_se_squeeze[0][0]         
__________________________________________________________________________________________________
block4b_se_reduce (Conv2D)      (None, 1, 1, 20)     9620        block4b_se_reshape[0][0]         
__________________________________________________________________________________________________
block4b_se_expand (Conv2D)      (None, 1, 1, 480)    10080       block4b_se_reduce[0][0]          
__________________________________________________________________________________________________
block4b_se_excite (Multiply)    (None, 8, 8, 480)    0           block4b_activation[0][0]         
                                                                 block4b_se_expand[0][0]          
__________________________________________________________________________________________________
block4b_project_conv (Conv2D)   (None, 8, 8, 80)     38400       block4b_se_excite[0][0]          
__________________________________________________________________________________________________
block4b_project_bn (BatchNormal (None, 8, 8, 80)     320         block4b_project_conv[0][0]       
__________________________________________________________________________________________________
block4b_drop (Dropout)          (None, 8, 8, 80)     0           block4b_project_bn[0][0]         
__________________________________________________________________________________________________
block4b_add (Add)               (None, 8, 8, 80)     0           block4b_drop[0][0]               
                                                                 block4a_project_bn[0][0]         
__________________________________________________________________________________________________
block4c_expand_conv (Conv2D)    (None, 8, 8, 480)    38400       block4b_add[0][0]                
__________________________________________________________________________________________________
block4c_expand_bn (BatchNormali (None, 8, 8, 480)    1920        block4c_expand_conv[0][0]        
__________________________________________________________________________________________________
block4c_expand_activation (Acti (None, 8, 8, 480)    0           block4c_expand_bn[0][0]          
__________________________________________________________________________________________________
block4c_dwconv (DepthwiseConv2D (None, 8, 8, 480)    4320        block4c_expand_activation[0][0]  
__________________________________________________________________________________________________
block4c_bn (BatchNormalization) (None, 8, 8, 480)    1920        block4c_dwconv[0][0]             
__________________________________________________________________________________________________
block4c_activation (Activation) (None, 8, 8, 480)    0           block4c_bn[0][0]                 
__________________________________________________________________________________________________
block4c_se_squeeze (GlobalAvera (None, 480)          0           block4c_activation[0][0]         
__________________________________________________________________________________________________
block4c_se_reshape (Reshape)    (None, 1, 1, 480)    0           block4c_se_squeeze[0][0]         
__________________________________________________________________________________________________
block4c_se_reduce (Conv2D)      (None, 1, 1, 20)     9620        block4c_se_reshape[0][0]         
__________________________________________________________________________________________________
block4c_se_expand (Conv2D)      (None, 1, 1, 480)    10080       block4c_se_reduce[0][0]          
__________________________________________________________________________________________________
block4c_se_excite (Multiply)    (None, 8, 8, 480)    0           block4c_activation[0][0]         
                                                                 block4c_se_expand[0][0]          
__________________________________________________________________________________________________
block4c_project_conv (Conv2D)   (None, 8, 8, 80)     38400       block4c_se_excite[0][0]          
__________________________________________________________________________________________________
block4c_project_bn (BatchNormal (None, 8, 8, 80)     320         block4c_project_conv[0][0]       
__________________________________________________________________________________________________
block4c_drop (Dropout)          (None, 8, 8, 80)     0           block4c_project_bn[0][0]         
__________________________________________________________________________________________________
block4c_add (Add)               (None, 8, 8, 80)     0           block4c_drop[0][0]               
                                                                 block4b_add[0][0]                
__________________________________________________________________________________________________
block5a_expand_conv (Conv2D)    (None, 8, 8, 480)    38400       block4c_add[0][0]                
__________________________________________________________________________________________________
block5a_expand_bn (BatchNormali (None, 8, 8, 480)    1920        block5a_expand_conv[0][0]        
__________________________________________________________________________________________________
block5a_expand_activation (Acti (None, 8, 8, 480)    0           block5a_expand_bn[0][0]          
__________________________________________________________________________________________________
block5a_dwconv (DepthwiseConv2D (None, 8, 8, 480)    12000       block5a_expand_activation[0][0]  
__________________________________________________________________________________________________
block5a_bn (BatchNormalization) (None, 8, 8, 480)    1920        block5a_dwconv[0][0]             
__________________________________________________________________________________________________
block5a_activation (Activation) (None, 8, 8, 480)    0           block5a_bn[0][0]                 
__________________________________________________________________________________________________
block5a_se_squeeze (GlobalAvera (None, 480)          0           block5a_activation[0][0]         
__________________________________________________________________________________________________
block5a_se_reshape (Reshape)    (None, 1, 1, 480)    0           block5a_se_squeeze[0][0]         
__________________________________________________________________________________________________
block5a_se_reduce (Conv2D)      (None, 1, 1, 20)     9620        block5a_se_reshape[0][0]         
__________________________________________________________________________________________________
block5a_se_expand (Conv2D)      (None, 1, 1, 480)    10080       block5a_se_reduce[0][0]          
__________________________________________________________________________________________________
block5a_se_excite (Multiply)    (None, 8, 8, 480)    0           block5a_activation[0][0]         
                                                                 block5a_se_expand[0][0]          
__________________________________________________________________________________________________
block5a_project_conv (Conv2D)   (None, 8, 8, 112)    53760       block5a_se_excite[0][0]          
__________________________________________________________________________________________________
block5a_project_bn (BatchNormal (None, 8, 8, 112)    448         block5a_project_conv[0][0]       
__________________________________________________________________________________________________
block5b_expand_conv (Conv2D)    (None, 8, 8, 672)    75264       block5a_project_bn[0][0]         
__________________________________________________________________________________________________
block5b_expand_bn (BatchNormali (None, 8, 8, 672)    2688        block5b_expand_conv[0][0]        
__________________________________________________________________________________________________
block5b_expand_activation (Acti (None, 8, 8, 672)    0           block5b_expand_bn[0][0]          
__________________________________________________________________________________________________
block5b_dwconv (DepthwiseConv2D (None, 8, 8, 672)    16800       block5b_expand_activation[0][0]  
__________________________________________________________________________________________________
block5b_bn (BatchNormalization) (None, 8, 8, 672)    2688        block5b_dwconv[0][0]             
__________________________________________________________________________________________________
block5b_activation (Activation) (None, 8, 8, 672)    0           block5b_bn[0][0]                 
__________________________________________________________________________________________________
block5b_se_squeeze (GlobalAvera (None, 672)          0           block5b_activation[0][0]         
__________________________________________________________________________________________________
block5b_se_reshape (Reshape)    (None, 1, 1, 672)    0           block5b_se_squeeze[0][0]         
__________________________________________________________________________________________________
block5b_se_reduce (Conv2D)      (None, 1, 1, 28)     18844       block5b_se_reshape[0][0]         
__________________________________________________________________________________________________
block5b_se_expand (Conv2D)      (None, 1, 1, 672)    19488       block5b_se_reduce[0][0]          
__________________________________________________________________________________________________
block5b_se_excite (Multiply)    (None, 8, 8, 672)    0           block5b_activation[0][0]         
                                                                 block5b_se_expand[0][0]          
__________________________________________________________________________________________________
block5b_project_conv (Conv2D)   (None, 8, 8, 112)    75264       block5b_se_excite[0][0]          
__________________________________________________________________________________________________
block5b_project_bn (BatchNormal (None, 8, 8, 112)    448         block5b_project_conv[0][0]       
__________________________________________________________________________________________________
block5b_drop (Dropout)          (None, 8, 8, 112)    0           block5b_project_bn[0][0]         
__________________________________________________________________________________________________
block5b_add (Add)               (None, 8, 8, 112)    0           block5b_drop[0][0]               
                                                                 block5a_project_bn[0][0]         
__________________________________________________________________________________________________
block5c_expand_conv (Conv2D)    (None, 8, 8, 672)    75264       block5b_add[0][0]                
__________________________________________________________________________________________________
block5c_expand_bn (BatchNormali (None, 8, 8, 672)    2688        block5c_expand_conv[0][0]        
__________________________________________________________________________________________________
block5c_expand_activation (Acti (None, 8, 8, 672)    0           block5c_expand_bn[0][0]          
__________________________________________________________________________________________________
block5c_dwconv (DepthwiseConv2D (None, 8, 8, 672)    16800       block5c_expand_activation[0][0]  
__________________________________________________________________________________________________
block5c_bn (BatchNormalization) (None, 8, 8, 672)    2688        block5c_dwconv[0][0]             
__________________________________________________________________________________________________
block5c_activation (Activation) (None, 8, 8, 672)    0           block5c_bn[0][0]                 
__________________________________________________________________________________________________
block5c_se_squeeze (GlobalAvera (None, 672)          0           block5c_activation[0][0]         
__________________________________________________________________________________________________
block5c_se_reshape (Reshape)    (None, 1, 1, 672)    0           block5c_se_squeeze[0][0]         
__________________________________________________________________________________________________
block5c_se_reduce (Conv2D)      (None, 1, 1, 28)     18844       block5c_se_reshape[0][0]         
__________________________________________________________________________________________________
block5c_se_expand (Conv2D)      (None, 1, 1, 672)    19488       block5c_se_reduce[0][0]          
__________________________________________________________________________________________________
block5c_se_excite (Multiply)    (None, 8, 8, 672)    0           block5c_activation[0][0]         
                                                                 block5c_se_expand[0][0]          
__________________________________________________________________________________________________
block5c_project_conv (Conv2D)   (None, 8, 8, 112)    75264       block5c_se_excite[0][0]          
__________________________________________________________________________________________________
block5c_project_bn (BatchNormal (None, 8, 8, 112)    448         block5c_project_conv[0][0]       
__________________________________________________________________________________________________
block5c_drop (Dropout)          (None, 8, 8, 112)    0           block5c_project_bn[0][0]         
__________________________________________________________________________________________________
block5c_add (Add)               (None, 8, 8, 112)    0           block5c_drop[0][0]               
                                                                 block5b_add[0][0]                
__________________________________________________________________________________________________
block6a_expand_conv (Conv2D)    (None, 8, 8, 672)    75264       block5c_add[0][0]                
__________________________________________________________________________________________________
block6a_expand_bn (BatchNormali (None, 8, 8, 672)    2688        block6a_expand_conv[0][0]        
__________________________________________________________________________________________________
block6a_expand_activation (Acti (None, 8, 8, 672)    0           block6a_expand_bn[0][0]          
__________________________________________________________________________________________________
block6a_dwconv_pad (ZeroPadding (None, 11, 11, 672)  0           block6a_expand_activation[0][0]  
__________________________________________________________________________________________________
block6a_dwconv (DepthwiseConv2D (None, 4, 4, 672)    16800       block6a_dwconv_pad[0][0]         
__________________________________________________________________________________________________
block6a_bn (BatchNormalization) (None, 4, 4, 672)    2688        block6a_dwconv[0][0]             
__________________________________________________________________________________________________
block6a_activation (Activation) (None, 4, 4, 672)    0           block6a_bn[0][0]                 
__________________________________________________________________________________________________
block6a_se_squeeze (GlobalAvera (None, 672)          0           block6a_activation[0][0]         
__________________________________________________________________________________________________
block6a_se_reshape (Reshape)    (None, 1, 1, 672)    0           block6a_se_squeeze[0][0]         
__________________________________________________________________________________________________
block6a_se_reduce (Conv2D)      (None, 1, 1, 28)     18844       block6a_se_reshape[0][0]         
__________________________________________________________________________________________________
block6a_se_expand (Conv2D)      (None, 1, 1, 672)    19488       block6a_se_reduce[0][0]          
__________________________________________________________________________________________________
block6a_se_excite (Multiply)    (None, 4, 4, 672)    0           block6a_activation[0][0]         
                                                                 block6a_se_expand[0][0]          
__________________________________________________________________________________________________
block6a_project_conv (Conv2D)   (None, 4, 4, 192)    129024      block6a_se_excite[0][0]          
__________________________________________________________________________________________________
block6a_project_bn (BatchNormal (None, 4, 4, 192)    768         block6a_project_conv[0][0]       
__________________________________________________________________________________________________
block6b_expand_conv (Conv2D)    (None, 4, 4, 1152)   221184      block6a_project_bn[0][0]         
__________________________________________________________________________________________________
block6b_expand_bn (BatchNormali (None, 4, 4, 1152)   4608        block6b_expand_conv[0][0]        
__________________________________________________________________________________________________
block6b_expand_activation (Acti (None, 4, 4, 1152)   0           block6b_expand_bn[0][0]          
__________________________________________________________________________________________________
block6b_dwconv (DepthwiseConv2D (None, 4, 4, 1152)   28800       block6b_expand_activation[0][0]  
__________________________________________________________________________________________________
block6b_bn (BatchNormalization) (None, 4, 4, 1152)   4608        block6b_dwconv[0][0]             
__________________________________________________________________________________________________
block6b_activation (Activation) (None, 4, 4, 1152)   0           block6b_bn[0][0]                 
__________________________________________________________________________________________________
block6b_se_squeeze (GlobalAvera (None, 1152)         0           block6b_activation[0][0]         
__________________________________________________________________________________________________
block6b_se_reshape (Reshape)    (None, 1, 1, 1152)   0           block6b_se_squeeze[0][0]         
__________________________________________________________________________________________________
block6b_se_reduce (Conv2D)      (None, 1, 1, 48)     55344       block6b_se_reshape[0][0]         
__________________________________________________________________________________________________
block6b_se_expand (Conv2D)      (None, 1, 1, 1152)   56448       block6b_se_reduce[0][0]          
__________________________________________________________________________________________________
block6b_se_excite (Multiply)    (None, 4, 4, 1152)   0           block6b_activation[0][0]         
                                                                 block6b_se_expand[0][0]          
__________________________________________________________________________________________________
block6b_project_conv (Conv2D)   (None, 4, 4, 192)    221184      block6b_se_excite[0][0]          
__________________________________________________________________________________________________
block6b_project_bn (BatchNormal (None, 4, 4, 192)    768         block6b_project_conv[0][0]       
__________________________________________________________________________________________________
block6b_drop (Dropout)          (None, 4, 4, 192)    0           block6b_project_bn[0][0]         
__________________________________________________________________________________________________
block6b_add (Add)               (None, 4, 4, 192)    0           block6b_drop[0][0]               
                                                                 block6a_project_bn[0][0]         
__________________________________________________________________________________________________
block6c_expand_conv (Conv2D)    (None, 4, 4, 1152)   221184      block6b_add[0][0]                
__________________________________________________________________________________________________
block6c_expand_bn (BatchNormali (None, 4, 4, 1152)   4608        block6c_expand_conv[0][0]        
__________________________________________________________________________________________________
block6c_expand_activation (Acti (None, 4, 4, 1152)   0           block6c_expand_bn[0][0]          
__________________________________________________________________________________________________
block6c_dwconv (DepthwiseConv2D (None, 4, 4, 1152)   28800       block6c_expand_activation[0][0]  
__________________________________________________________________________________________________
block6c_bn (BatchNormalization) (None, 4, 4, 1152)   4608        block6c_dwconv[0][0]             
__________________________________________________________________________________________________
block6c_activation (Activation) (None, 4, 4, 1152)   0           block6c_bn[0][0]                 
__________________________________________________________________________________________________
block6c_se_squeeze (GlobalAvera (None, 1152)         0           block6c_activation[0][0]         
__________________________________________________________________________________________________
block6c_se_reshape (Reshape)    (None, 1, 1, 1152)   0           block6c_se_squeeze[0][0]         
__________________________________________________________________________________________________
block6c_se_reduce (Conv2D)      (None, 1, 1, 48)     55344       block6c_se_reshape[0][0]         
__________________________________________________________________________________________________
block6c_se_expand (Conv2D)      (None, 1, 1, 1152)   56448       block6c_se_reduce[0][0]          
__________________________________________________________________________________________________
block6c_se_excite (Multiply)    (None, 4, 4, 1152)   0           block6c_activation[0][0]         
                                                                 block6c_se_expand[0][0]          
__________________________________________________________________________________________________
block6c_project_conv (Conv2D)   (None, 4, 4, 192)    221184      block6c_se_excite[0][0]          
__________________________________________________________________________________________________
block6c_project_bn (BatchNormal (None, 4, 4, 192)    768         block6c_project_conv[0][0]       
__________________________________________________________________________________________________
block6c_drop (Dropout)          (None, 4, 4, 192)    0           block6c_project_bn[0][0]         
__________________________________________________________________________________________________
block6c_add (Add)               (None, 4, 4, 192)    0           block6c_drop[0][0]               
                                                                 block6b_add[0][0]                
__________________________________________________________________________________________________
block6d_expand_conv (Conv2D)    (None, 4, 4, 1152)   221184      block6c_add[0][0]                
__________________________________________________________________________________________________
block6d_expand_bn (BatchNormali (None, 4, 4, 1152)   4608        block6d_expand_conv[0][0]        
__________________________________________________________________________________________________
block6d_expand_activation (Acti (None, 4, 4, 1152)   0           block6d_expand_bn[0][0]          
__________________________________________________________________________________________________
block6d_dwconv (DepthwiseConv2D (None, 4, 4, 1152)   28800       block6d_expand_activation[0][0]  
__________________________________________________________________________________________________
block6d_bn (BatchNormalization) (None, 4, 4, 1152)   4608        block6d_dwconv[0][0]             
__________________________________________________________________________________________________
block6d_activation (Activation) (None, 4, 4, 1152)   0           block6d_bn[0][0]                 
__________________________________________________________________________________________________
block6d_se_squeeze (GlobalAvera (None, 1152)         0           block6d_activation[0][0]         
__________________________________________________________________________________________________
block6d_se_reshape (Reshape)    (None, 1, 1, 1152)   0           block6d_se_squeeze[0][0]         
__________________________________________________________________________________________________
block6d_se_reduce (Conv2D)      (None, 1, 1, 48)     55344       block6d_se_reshape[0][0]         
__________________________________________________________________________________________________
block6d_se_expand (Conv2D)      (None, 1, 1, 1152)   56448       block6d_se_reduce[0][0]          
__________________________________________________________________________________________________
block6d_se_excite (Multiply)    (None, 4, 4, 1152)   0           block6d_activation[0][0]         
                                                                 block6d_se_expand[0][0]          
__________________________________________________________________________________________________
block6d_project_conv (Conv2D)   (None, 4, 4, 192)    221184      block6d_se_excite[0][0]          
__________________________________________________________________________________________________
block6d_project_bn (BatchNormal (None, 4, 4, 192)    768         block6d_project_conv[0][0]       
__________________________________________________________________________________________________
block6d_drop (Dropout)          (None, 4, 4, 192)    0           block6d_project_bn[0][0]         
__________________________________________________________________________________________________
block6d_add (Add)               (None, 4, 4, 192)    0           block6d_drop[0][0]               
                                                                 block6c_add[0][0]                
__________________________________________________________________________________________________
block7a_expand_conv (Conv2D)    (None, 4, 4, 1152)   221184      block6d_add[0][0]                
__________________________________________________________________________________________________
block7a_expand_bn (BatchNormali (None, 4, 4, 1152)   4608        block7a_expand_conv[0][0]        
__________________________________________________________________________________________________
block7a_expand_activation (Acti (None, 4, 4, 1152)   0           block7a_expand_bn[0][0]          
__________________________________________________________________________________________________
block7a_dwconv (DepthwiseConv2D (None, 4, 4, 1152)   10368       block7a_expand_activation[0][0]  
__________________________________________________________________________________________________
block7a_bn (BatchNormalization) (None, 4, 4, 1152)   4608        block7a_dwconv[0][0]             
__________________________________________________________________________________________________
block7a_activation (Activation) (None, 4, 4, 1152)   0           block7a_bn[0][0]                 
__________________________________________________________________________________________________
block7a_se_squeeze (GlobalAvera (None, 1152)         0           block7a_activation[0][0]         
__________________________________________________________________________________________________
block7a_se_reshape (Reshape)    (None, 1, 1, 1152)   0           block7a_se_squeeze[0][0]         
__________________________________________________________________________________________________
block7a_se_reduce (Conv2D)      (None, 1, 1, 48)     55344       block7a_se_reshape[0][0]         
__________________________________________________________________________________________________
block7a_se_expand (Conv2D)      (None, 1, 1, 1152)   56448       block7a_se_reduce[0][0]          
__________________________________________________________________________________________________
block7a_se_excite (Multiply)    (None, 4, 4, 1152)   0           block7a_activation[0][0]         
                                                                 block7a_se_expand[0][0]          
__________________________________________________________________________________________________
block7a_project_conv (Conv2D)   (None, 4, 4, 320)    368640      block7a_se_excite[0][0]          
__________________________________________________________________________________________________
block7a_project_bn (BatchNormal (None, 4, 4, 320)    1280        block7a_project_conv[0][0]       
__________________________________________________________________________________________________
top_conv (Conv2D)               (None, 4, 4, 1280)   409600      block7a_project_bn[0][0]         
__________________________________________________________________________________________________
top_bn (BatchNormalization)     (None, 4, 4, 1280)   5120        top_conv[0][0]                   
__________________________________________________________________________________________________
top_activation (Activation)     (None, 4, 4, 1280)   0           top_bn[0][0]                     
__________________________________________________________________________________________________
avg_pool (GlobalAveragePooling2 (None, 1280)         0           top_activation[0][0]             
__________________________________________________________________________________________________
top_dropout (Dropout)           (None, 1280)         0           avg_pool[0][0]                   
__________________________________________________________________________________________________
predictions (Dense)             (None, 6)            7686        top_dropout[0][0]                
==================================================================================================
Total params: 4,057,257
Trainable params: 4,015,234
Non-trainable params: 42,023
__________________________________________________________________________________________________
model.compile(optimizer='Adam', loss='categorical_crossentropy')

3. Keras 모델에 학습시키기 위한 Train, Test Set 구축하기

DataGenerator = tf.keras.preprocessing.image.ImageDataGenerator(rescale = 1. / 255, validation_split = 0.2)
file_list = file_list.sample(frac = 1)
train_generator = DataGenerator.flow_from_dataframe(file_list,                # 데이터프레임
                                        x_col = 'dir_name',     # 파일위치 열이름
                                        y_col = 'category',        # 클래스 열이름
                                        target_size = (124,124),    # 이미지 사이즈
                                        color_mode= 'rgb',          # 이미지 채널수
                                        class_mode= 'categorical',  # Y값 변화방법
                                        batch_size= 32,         # 배치사이즈
                                        Shuffle = True,         # 랜덤 여부
                                        seed = 42,              # 랜덤엔 시드
                                        subset = "training"
                                        ) 
Found 4778 validated image filenames belonging to 6 classes.
val_generator = DataGenerator.flow_from_dataframe(file_list,                # 데이터프레임
                                        x_col = 'dir_name',     # 파일위치 열이름
                                        y_col = 'category',        # 클래스 열이름
                                        target_size = (124,124),    # 이미지 사이즈
                                        color_mode= 'rgb',          # 이미지 채널수
                                        class_mode= 'categorical',  # Y값 변화방법
                                        batch_size= 32,         # 배치사이즈
                                        Shuffle = True,         # 랜덤 여부
                                        seed = 42,              # 랜덤엔 시드
                                        subset = "validation"
                                        ) 
Found 1194 validated image filenames belonging to 6 classes.
training_y = list()
for i in tqdm(range(len(train_generator))) :
    training_y = training_y + list(train_generator[i][1])
training_y = pd.DataFrame(training_y)
training_y["Y"] = training_y.idxmax(axis = "columns")
training_y.Y.value_counts().sort_index()
100%|████████████████████████████████████████████████████████████████████████████| 150/150 [00:14<00:00, 10.69it/s]





0    790
1    788
2    827
3    774
4    807
5    792
Name: Y, dtype: int64
val_y = list()
for i in tqdm(range(len(val_generator))) :
    val_y = val_y + list(val_generator[i][1])
val_y = pd.DataFrame(val_y)
val_y["Y"] = val_y.idxmax(axis = "columns")
val_y.Y.value_counts().sort_index()
100%|██████████████████████████████████████████████████████████████████████████████| 38/38 [00:03<00:00, 12.14it/s]





0    204
1    212
2    168
3    214
4    188
5    208
Name: Y, dtype: int64
chk_ = train_generator.next()
print(chk_[0][0].shape)
print(chk_[1][0])
plt.imshow((chk_[0][0] * 255).astype(int))
plt.show()
(124, 124, 3)
[0. 0. 0. 0. 1. 0.]

png

Oops

chk_ = val_generator.next()
print(chk_[0][0].shape)
print(chk_[1][0])
plt.imshow((chk_[0][0] * 255).astype(int))
plt.show()
(124, 124, 3)
[0. 0. 1. 0. 0. 0.]

png

Oops


4. 학습 및 검증

%time hist = model.fit_generator(train_generator, epochs=50, verbose=1)
Epoch 1/50
150/150 [==============================] - 201s 1s/step - loss: 3.0040
Epoch 2/50
150/150 [==============================] - 197s 1s/step - loss: 2.1460
Epoch 3/50
150/150 [==============================] - 192s 1s/step - loss: 1.9840
Epoch 4/50
150/150 [==============================] - 187s 1s/step - loss: 1.7931
Epoch 5/50
150/150 [==============================] - 189s 1s/step - loss: 1.5907
Epoch 6/50
150/150 [==============================] - 185s 1s/step - loss: 1.3879
Epoch 7/50
150/150 [==============================] - 186s 1s/step - loss: 1.2180
Epoch 8/50
150/150 [==============================] - 202s 1s/step - loss: 1.0472
Epoch 9/50
150/150 [==============================] - 196s 1s/step - loss: 0.8599
Epoch 10/50
150/150 [==============================] - 189s 1s/step - loss: 0.7362
Epoch 11/50
150/150 [==============================] - 195s 1s/step - loss: 0.7367
Epoch 12/50
150/150 [==============================] - 198s 1s/step - loss: 0.6045
Epoch 13/50
150/150 [==============================] - 188s 1s/step - loss: 0.6141
Epoch 14/50
150/150 [==============================] - 187s 1s/step - loss: 0.5978
Epoch 15/50
150/150 [==============================] - 192s 1s/step - loss: 0.5272
Epoch 16/50
150/150 [==============================] - 187s 1s/step - loss: 0.5383
Epoch 17/50
150/150 [==============================] - 192s 1s/step - loss: 0.4453
Epoch 18/50
150/150 [==============================] - 194s 1s/step - loss: 0.3941
Epoch 19/50
150/150 [==============================] - 189s 1s/step - loss: 0.3781
Epoch 20/50
150/150 [==============================] - 199s 1s/step - loss: 0.3523
Epoch 21/50
150/150 [==============================] - 195s 1s/step - loss: 0.3675
Epoch 22/50
150/150 [==============================] - 192s 1s/step - loss: 0.4094
Epoch 23/50
150/150 [==============================] - 199s 1s/step - loss: 0.3186
Epoch 24/50
150/150 [==============================] - 195s 1s/step - loss: 0.2725
Epoch 25/50
150/150 [==============================] - 208s 1s/step - loss: 0.2893
Epoch 26/50
150/150 [==============================] - 198s 1s/step - loss: 0.2878
Epoch 27/50
150/150 [==============================] - 201s 1s/step - loss: 0.2867
Epoch 28/50
150/150 [==============================] - 250s 2s/step - loss: 0.2562
Epoch 29/50
150/150 [==============================] - 231s 2s/step - loss: 0.2884
Epoch 30/50
150/150 [==============================] - 250s 2s/step - loss: 0.3691
Epoch 31/50
150/150 [==============================] - 246s 2s/step - loss: 0.2672
Epoch 32/50
150/150 [==============================] - 248s 2s/step - loss: 0.2765
Epoch 33/50
150/150 [==============================] - 247s 2s/step - loss: 0.2616
Epoch 34/50
150/150 [==============================] - 480s 3s/step - loss: 0.2567
Epoch 35/50
150/150 [==============================] - 204s 1s/step - loss: 0.1908
Epoch 36/50
150/150 [==============================] - 212s 1s/step - loss: 0.4389
Epoch 37/50
150/150 [==============================] - 195s 1s/step - loss: 0.2498
Epoch 38/50
150/150 [==============================] - 192s 1s/step - loss: 0.1942
Epoch 39/50
150/150 [==============================] - 191s 1s/step - loss: 0.1737
Epoch 40/50
150/150 [==============================] - 191s 1s/step - loss: 0.1947
Epoch 41/50
150/150 [==============================] - 192s 1s/step - loss: 0.1782
Epoch 42/50
150/150 [==============================] - 193s 1s/step - loss: 0.1515
Epoch 43/50
150/150 [==============================] - 192s 1s/step - loss: 0.1196
Epoch 44/50
150/150 [==============================] - 191s 1s/step - loss: 0.1325
Epoch 45/50
150/150 [==============================] - 191s 1s/step - loss: 0.1362
Epoch 46/50
150/150 [==============================] - 198s 1s/step - loss: 0.1459
Epoch 47/50
150/150 [==============================] - 204s 1s/step - loss: 0.1424
Epoch 48/50
150/150 [==============================] - 191s 1s/step - loss: 0.1122
Epoch 49/50
150/150 [==============================] - 191s 1s/step - loss: 0.1223
Epoch 50/50
150/150 [==============================] - 194s 1s/step - loss: 0.1044
Wall time: 2h 51min 49s
plt.plot(hist.history['loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
# plt.legend('Train', 'Test'], loc='upper left')
plt.show()

png

Oops

추후 다른 모델들과 비교하기 위해서 history를 저장해놓도록 하겠습니다.

hist_ = pd.DataFrame(hist.history["loss"]).reset_index()
hist_.rename(columns = {x : y for x, y in zip(hist_.columns, ["epoch", "loss"])}, inplace = True)
hist_.to_csv("model_metrics/first_classification_loss.csv", index= False)
hist_.head()
epoch loss
0 0 3.003965
1 1 2.145966
2 2 1.983974
3 3 1.793144
4 4 1.590744
predict_value = val_generator.next()
predict_value[1][0]
array([0., 0., 1., 0., 0., 0.], dtype=float32)
plt.imshow((predict_value[0][0] * 255).astype(int))
plt.show()

png

Oops

predict_value[0][0].shape
(124, 124, 3)
predict_proba = model.predict_generator(val_generator)
predict_proba = pd.DataFrame(predict_proba)
predict_proba.apply(sum, axis = 1)
0       1.0
1       1.0
2       1.0
3       1.0
4       1.0
       ... 
1189    1.0
1190    1.0
1191    1.0
1192    1.0
1193    1.0
Length: 1194, dtype: float64
predict_proba["predict"] = predict_proba.idxmax(axis = "columns")
predict_proba.predict.value_counts().sort_index()
0    176
1    188
2    181
3    144
4    198
5    307
Name: predict, dtype: int64

예측 결과보기

from sklearn.metrics import confusion_matrix
confusion_matrix(predict_proba["predict"], val_y["Y"])
array([[26, 26, 24, 31, 32, 37],
       [36, 31, 29, 31, 22, 39],
       [37, 27, 23, 36, 25, 33],
       [28, 23, 22, 20, 25, 26],
       [28, 40, 29, 37, 32, 32],
       [49, 65, 41, 59, 52, 41]], dtype=int64)
# 참담...
(predict_proba["predict"] == val_y["Y"]).mean()
0.14489112227805695

추후 포스팅(순서는 미정입니다.)


포스팅을 마치며


code : https://github.com/Chanjun-kim/Chanjun-kim.github.io/blob/main/_ipynb/2021-06-08-CNN.ipynb

참고 자료 :