Cats vs Dogs image classifier

- image data generator 이용 : 학습 데이터셋 만들기

from tensorflow.keras import Sequential #keras model from tensorflow.keras.layers import Conv2D, MaxPool2D #Convolution layer from tensorflow.keras.layers import Dense, Flatten #Affine layer


공급 image 크기

img_h = 150 #height img_w = 150 #width input_shape = (img_h, img_w, 3)




1. CNN Model layer

print('model create') model = Sequential()


Convolution layer1

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape = input_shape)) model.add(MaxPool2D(pool_size=(2,2)))


Convolution layer2

model.add(Conv2D(64,kernel_size=(3, 3), activation='relu')) model.add(MaxPool2D(pool_size=(2,2)))


Convolution layer3 : maxpooling() 제외

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))


Flatten layer : 3d -> 1d

model.add(Flatten())


DNN hidden layer(Fully connected layer)

model.add(Dense(256, activation = 'relu'))


DNN Output layer

model.add(Dense(1, activation = 'sigmoid'))


model training set : Adam or RMSprop

model.compile(optimizer = 'adam', loss = 'binary_crossentropy', # one hot encoding metrics = ['accuracy'])




2. image file preprocessing : image 제너레이터

from tensorflow.keras.preprocessing.image import ImageDataGenerator


dir setting

base_dir = r"C:\ITWILL\5_Tensorflow\data\images\cats_and_dogs" train_dir = base_dir + '/train_dir' validation_dir = base_dir + '/validation_dir'


학습 이미지 데이터셋 생성기

train_data = ImageDataGenerator(rescale=1./255) # 정규화


검증 이미지 데이터셋 생성기

validation_data = ImageDataGenerator(rescale=1./255)


학습 이미지 생성기 -> 이미지 가공

train_generator = train_data.flow_from_directory( train_dir, target_size=(150,150), #image reshape batch_size=20, #20장씩 모델 공급 class_mode='binary') #binary label로 이항분류 #Found 2000 images belonging to 2 classes.


검증 이미지 생성기 -> 이미지 가공

validation_generator = validation_data.flow_from_directory( validation_dir, target_size=(150,150), batch_size=20, #20장씩 모델 공급 class_mode='binary') #binary label로 이항분류 #Found 1000 images belonging to 2 classes.




3. model training : image제너레이터 이용 모델 훈련
* model.fit()

model_fit = model.fit_generator( train_generator, steps_per_epoch=100, #batch_size의 step수 = "batch_size 20을 100번 반복해라" = "20*100=2000" epochs=10, #2000 * 10 = 20,000 validation_data=validation_generator, validation_steps=50) #batch_size의 step수 = 20*50

Epoch 10/10
- 42s 420ms/step - loss: 0.6932 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000

model evaluation

model.evaluate(validation_generator) #[0.6931475400924683, 0.5]




4. model history graph

import matplotlib.pyplot as plt print(model_fit.history.keys()) #dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy']) loss = model_fit.history['loss'] #train acc = model_fit.history['accuracy'] val_loss = model_fit.history['val_loss'] #validation val_acc = model_fit.history['val_accuracy']




과적합 시작점 확인

epochs = range(1, len(acc) + 1)


acc vs val_acc

plt.plot(epochs, acc, 'b--', label='train acc') plt.plot(epochs, val_acc, 'r', label='val acc') plt.title('Training vs validation accuracy') plt.xlabel('epoch') plt.ylabel('accuray') plt.legend(loc='best') plt.show()


loss vs val_loss

plt.plot(epochs, loss, 'b--', label='train loss') plt.plot(epochs, val_loss, 'r', label='val loss') plt.title('Training vs validation loss') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(loc='best') plt.show()





image Increase

* cats dogs imageGenerator 참고

model overfitting solution
1. Dropout 적용
2. image 증식

from tensorflow.keras import Sequential #keras model from tensorflow.keras.layers import Conv2D, MaxPool2D #Convolution from tensorflow.keras.layers import Dense, Dropout, Flatten #layer import os


Hyper parameters

img_h = 150 #height img_w = 150 #width input_shape = (img_h, img_w, 3)



1. CNN Model layer

print('model create') model = Sequential()


Convolution layer1 : kernel[3,3,3,32]

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape = input_shape)) model.add(MaxPool2D(pool_size=(2,2)))


Convolution layer2 : kernel[3,3,32,64]

model.add(Conv2D(64,kernel_size=(3, 3), activation='relu')) model.add(MaxPool2D(pool_size=(2,2)))


Convolution layer3 : kernel[5,5,64,128], maxpooling() 제외

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu')) model.add(MaxPool2D(pool_size=(2,2)))


Flatten layer :4d -> 2d

model.add(Flatten()) #[2차 적용] : 드롭아웃 - 과적합 해결 model.add(Dropout(0.5)) # fully connected 층 이전에 배치


Affine layer(Fully connected layer1) : [n, 256]

model.add(Dense(256, activation = 'relu'))


Output layer(Fully connected layer2) : [256, 1]

model.add(Dense(1, activation = 'sigmoid'))


model training set : Adam or RMSprop

model.compile(optimizer = 'adam', loss = 'binary_crossentropy', #one hot encoding metrics = ['accuracy'])




2. image file preprocessing : 이미지 제너레이터 이용

from tensorflow.keras.preprocessing.image import ImageDataGenerator print("image preprocessing")


dir setting

base_dir = "C:\\ITWILL\\5_Tensorflow\\data\\images\\cats_and_dogs" train_dir = os.path.join(base_dir, 'train_dir') validation_dir = os.path.join(base_dir, 'validation_dir')


1차 적용

#train_data = ImageDataGenerator(rescale=1./255)


[2차 적용] : image 증식 - 과적합 해결

train_data = ImageDataGenerator( rescale=1./255, #정규화 rotation_range = 40, #image 회전 각도 범위(+, - 범위) width_shift_range = 0.2, #image 수평 이동 범위 height_shift_range = 0.2, #image 수직 이용 범위 shear_range = 0.2, #image 전단 각도 범위 zoom_range=0.2, #image 확대 범위 horizontal_flip=True,) #image 수평 뒤집기 범위


검증 데이터에는 증식 적용 안함

validation_data = ImageDataGenerator(rescale=1./255) train_generator = train_data.flow_from_directory( train_dir, target_size=(150,150), batch_size=35, #[수정] batch size 올림 class_mode='binary') #binary label #Found 2000 images belonging to 2 classes. validation_generator = validation_data.flow_from_directory( validation_dir, target_size=(150,150), batch_size=35, #[수정] batch size 올림 class_mode='binary') #Found 1000 images belonging to 2 classes.




3. model training : 배치 제너레이터 이용 모델 훈련

model_fit = model.fit_generator( train_generator, steps_per_epoch=58, #58*35 = 1epoch epochs=30, #[수정] 30 epochs() validation_data=validation_generator, validation_steps=29) #29*35 = 1epoch


model evaluation

model.evaluate(validation_generator)



4. model history graph

import matplotlib.pyplot as plt print(model_fit.history.keys()) #dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy']) loss = model_fit.history['loss'] #train acc = model_fit.history['accuracy'] val_loss = model_fit.history['val_loss'] #validation val_acc = model_fit.history['val_accuracy'] epochs = range(1, len(acc) + 1)


acc vs val_acc

plt.plot(epochs, acc, 'b--', label='train acc') plt.plot(epochs, val_acc, 'r', label='val acc') plt.title('Training vs validation accuracy') plt.xlabel('epoch') plt.ylabel('accuray') plt.legend(loc='best') plt.show()


loss vs val_loss

plt.plot(epochs, loss, 'b--', label='train loss') plt.plot(epochs, val_loss, 'r', label='val loss') plt.title('Training vs validation loss') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(loc='best') plt.show()

+ Recent posts