DAY68. Tensorflow CNN model (2)ImageGenerator
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()