LEE_BOMB 2021. 12. 27. 20:38
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()