-
TensorFlow 기초 28 - 이미지 보강 - 이미지가 부족한 경우 기존 이미지를 변형시켜 이미지 수를 늘림TensorFlow 2022. 12. 7. 16:37
# 이미지 보강 - 이미지가 부족한 경우 기존 이미지를 변형시켜 이미지 수를 늘림 import tensorflow as tf from keras.datasets import fashion_mnist from keras.utils import to_categorical from keras.callbacks import ModelCheckpoint, EarlyStopping import matplotlib.pyplot as plt import numpy as np (x_train, y_train), (x_test, y_test) = fashion_mnist.load_data() x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255 x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255 # print(y_train[:3]) y_train = to_categorical(y_train) # print(y_train[:3]) y_test = to_categorical(y_test) # plt.figure(figsize=(10, 10)) # for c in range(100): # plt.subplot(10, 10, c + 1) # plt.imshow(x_train[c].reshape(28, 28), cmap='gray') # # plt.show() # 이미지 보강 연습 : x_train[0] Ankle boot from keras.preprocessing.image import ImageDataGenerator img_generator = ImageDataGenerator( rotation_range = 50, # 이미지 회전 값 zoom_range = 0.5, # 이미지 일부 확대/축소 shear_range = 0.5, # 이미지 기울기로 회전 width_shift_range = 0.5, # 좌우(수평) 이동 height_shift_range = 0.1, # 상하(수직) 이동 horizontal_flip = True, # 이미지 가로 뒤집기 vertical_flip = True # 이미지 세로 뒤집기 ) augument_size = 100 x_augument = img_generator.flow(np.tile(x_train[0].reshape(28 * 28), 100).reshape(-1, 28, 28, 1), np.zeros(augument_size), batch_size=augument_size, shuffle=False).next()[0] print(x_augument.shape) # (100, 28, 28, 1) # print(x_augument) plt.figure(figsize=(10, 10)) for c in range(100): plt.subplot(10, 10, c + 1) plt.axis('off') plt.imshow(x_augument[c].reshape(28, 28), cmap='gray') plt.show() # model model = tf.keras.models.Sequential([ # 이미지 데이터 특징 추출로 용량을 줄인다. tf.keras.layers.Conv2D(filters=32, kernel_size=3, input_shape=(28, 28, 1), padding='same', activation='relu'), tf.keras.layers.MaxPool2D(pool_size=2), tf.keras.layers.Dropout(0.3), tf.keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'), tf.keras.layers.MaxPool2D(pool_size=2), tf.keras.layers.Dropout(0.3), tf.keras.layers.Flatten(), # 백터로 데이터 한 줄로 세우기 # 이미지 분류기 tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.3), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dropout(0.3), tf.keras.layers.Dense(10, activation='softmax'), ]) print(model.summary()) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) import os model_dir = './mymnist' if not os.path.exists(model_dir): os.mkdir(model_dir) modelpath = './mymnist/{epoch:02d}-{val_loss:.3f}.hdf5' chkpoint = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=0, sabe_best_only=True) es = EarlyStopping(monitor='val_loss', patience=5) history = model.fit(x_train, y_train, validation_split=0.2, epochs=100, batch_size=64, verbose=0, callbacks=[es, chkpoint]) print('evaluate acc : %.4f'%(model.evaluate(x_test, y_test, batch_size=64, verbose=0)[0])) history = history.history plt.subplot(1, 2, 1) plt.plot(history['acc'], marker='o', c='red', label='accuracy') plt.plot(history['val_acc'], marker='s', c='blue', label='val_accuracy') plt.xlabel('epochs') plt.legend() plt.subplot(1, 2, 2) plt.plot(history['loss'], marker='o', c='red', label='loss') plt.plot(history['val_loss'], marker='s', c='blue', label='val_loss') plt.xlabel('epochs') plt.legend() plt.show()
rotation_range = 이미지 회전 값
zoom_range = 이미지 일부 확대/축소
shear_range = 이미지 기울기로 회전
width_shift_range = 좌우(수평) 이동
height_shift_range = # 상하(수직) 이동
horizontal_flip = 이미지 가로 뒤집기
vertical_flip = 이미지 세로 뒤집기기존 이미지를 변형 'TensorFlow' 카테고리의 다른 글
TensorFlow 기초 30 - cnn을 통한 댕댕이와 냥이 분류 모델 (0) 2022.12.08 TensorFlow 기초 29 - CNN을 활용해 이미지 특징을 뽑아 Dense로 학습(컬러 사) (0) 2022.12.08 TensorFlow 기초 27 - Fashion MNIST로 CNN 처리 - sub classing model 사용 (0) 2022.12.07 TensorFlow 기초 26 - Fashion MNIST로 처리 - Functional api 사용 (0) 2022.12.07 TensorFlow 기초 25 - MNIST로 CNN 처리 (0) 2022.12.07