데이터 증식하기.
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np
horse = img_to_array(load_img('/content/blackbeauty.jfif')).astype(np.uint8)
plt.figure()
plt.imshow(horse)
plt.show()
print()
^ 이미지 불러오기
^ 이미지에 대한 정보 확인하기
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np
# 기본 이지미 -> (164, 307, 3) -> 차트로 그리기
horse = img_to_array(load_img('/content/blackbeauty.jfif')).astype(np.uint8)
plt.figure()
plt.imshow(horse)
plt.show()
# 데이터 증식
train_datagen = ImageDataGenerator(horizontal_flip = True,
vertical_flip = True,
shear_range = 0.5,
brightness_range = [0.5, 1.5],
zoom_range = 0.2,
width_shift_range = 0.1,
height_shift_range = 0.1,
rotation_range = 30,
fill_mode = 'nearest'
)
horse = horse.reshape((1,)+horse.shape) # (1, 164, 307, 3)
print(horse.shape)
^ 데이터 증식
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np
# 기본 이지미 -> (164, 307, 3) -> 차트로 그리기
horse = img_to_array(load_img('/content/blackbeauty.jfif')).astype(np.uint8)
plt.figure()
plt.imshow(horse)
plt.show()
# 데이터 증식
train_datagen = ImageDataGenerator(horizontal_flip = True,
vertical_flip = True,
shear_range = 0.5,
brightness_range = [0.5, 1.5],
zoom_range = 0.2,
width_shift_range = 0.1,
height_shift_range = 0.1,
rotation_range = 30,
fill_mode = 'nearest'
)
horse = horse.reshape((1,)+horse.shape) # (1, 164, 307, 3)
# print(horse.shape)
train_generator = train_datagen.flow(horse, batch_size=1)
plt.figure(figsize = (5, 5))
for i in range(9):
data = next(train_generator)
image = data[0]
plt.subplot(3, 3, i+1)
plt.xticks([])
plt.yticks([])
plt.imshow(np.array(image, dtype = np.uint8), cmap = 'gray')
plt.show()
^ 이미지 증식 최종 코드
런타임 GPU 로 설정하기.
!wget --no-check-certificate \
https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
-O /tmp/cats_and_dogs_filtered.zip
^ Google api 통해 데이터 불러오기
# 압축풀기
import os
import zipfile
local_zip = '/tmp/cats_and_dogs_filtered.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()
^ 폴더 나누기
^ 옆에 폴더 생성이 되었을 것임.
^ tmp 속 폴더 어떻게 나눠져있는지 볼 수 있다.
# 데이터 경로 설정
rootPath = '/tmp/cats_and_dogs_filtered'
train_dir = os.path.join(rootPath, 'train')
^ 데이터 경로 설정
# 데이터 경로 설정
rootPath = '/tmp/cats_and_dogs_filtered'
# 훈련셋, 검증셋 경로
train_dir = os.path.join(rootPath, 'train') # /tmp/cats_and_dogs_filtered/train
validation_dir = os.path.join(rootPath, 'validation') # /tmp/cats_and_dogs_filtered/validation
# 훈련셋 중에 고양이 사진 경로
train_cats_dir = os.path.join(train_dir, 'cats') # /tmp/cats_and_dogs_filtered/train/cats
# 훈련셋 중에 강아지 사진 경로
train_dogs_dir = os.path.join(train_dir, 'dogs') # /tmp/cats_and_dogs_filtered/train/dogs
# 검증셋 중에 고양이 사진 경로
validation_cats_dir = os.path.join(validation_dir, 'cats') # /tmp/cats_and_dogs_filtered/validation/cats
# 검증셋 중에 강아지 사진 경로
validation_dogs_dir = os.path.join(validation_dir, 'dogs') # /tmp/cats_and_dogs_filtered/validation/dogs
^ 데이터 경로 설정
train_cat_fnames = os.listdir(train_cats_dir)
train_cat_fnames.sort()
print(train_cat_fnames[:10])
print('훈련 데이터 중 고양이 사진 수:', len( os.listdir(train_cats_dir)))
print('훈련 데이터 중 강아지 사진 수:', len( os.listdir(train_dogs_dir)))
print('검증 데이터 중 고양이 사진 수:', len( os.listdir(validation_cats_dir)))
print('검증 데이터 중 강아지 사진 수:', len( os.listdir(validation_dogs_dir)))
^ 데이터 확인하기
데이터 증식 (Data Argumentation)
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 데이터 경로 설정
rootPath = '/tmp/cats_and_dogs_filtered'
# 스케일링 + 데이터 증식 속성 설정
trainImageGenerator = ImageDataGenerator(rescale=1./255,
horizontal_flip = True,
vertical_flip = True,
shear_range = 0.5,
brightness_range = [0.5, 1.5],
zoom_range = 0.2,
width_shift_range = 0.1,
height_shift_range = 0.1,
rotation_range = 30,
fill_mode = 'nearest')
# 스케일링 설정
testImageGenerator = ImageDataGenerator(rescale=1./255)
trainGen = trainImageGenerator.flow_from_directory(
os.path.join(rootPath, 'train'),
target_size=(64,64),
class_mode = 'binary'
)
testGen = testImageGenerator.flow_from_directory(
os.path.join(rootPath, 'validation'),
target_size=(64,64),
class_mode = 'binary'
)
^ 데이터 증식
^ 잘 정리되었는지 확인
from tensorflow.keras.preprocessing.image import array_to_img
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(5,5))
for i in range(9):
data = next(trainGen)
arr = data[0][0]
plt.subplot(3,3,i+1)
plt.xticks([]) # 눈금 지우기
plt.yticks([]) # 눈금 지우기
img = array_to_img(arr).resize((128, 128))
plt.imshow(img)
plt.show()
^ 이미지 불러오기
^ 위의 코드에서 testGen 만 변경함.
from re import X
label_index = trainGen.class_indices
# {'cats':0, 'dogs':1}
x,y = trainGen.next()
# print(len(x))
for i in range(0,3):
image = x[i]
label = y[i].astype('int')
plt.xticks([]) # 눈금 지우기
plt.yticks([]) # 눈금 지우기
print('사진: {}'.format([k for k, v in label_index.items() if v == label]))
plt.imshow(image)
plt.show()
^ 고양이 사진이나 강아지 사진들을 볼 수 있다.
from re import X
label_index = trainGen.class_indices
# {'cats':0, 'dogs':1}
x,y = trainGen.next()
# print(len(x))
for i in range(0,3):
image = x[i]
label = y[i].astype('int')
plt.xticks([]) # 눈금 지우기
plt.yticks([]) # 눈금 지우기
print('사진: {}'.format([k for k, v in label_index.items() if v == label]))
print('사진: {}'.format(label))
plt.imshow(image)
plt.show()
^ 강아지 1인 값을 dogs 로 보여줌.
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
# 3개의 컨블루션 신경망 사용
model = Sequential()
model.add(layers.InputLayer(input_shape=(64, 64, 3)))
model.add(layers.Conv2D(16, (3,3), (1,1), 'same', activation='relu')) #16
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(rate=0.3))
model.add(layers.Conv2D(32, (3,3), (1,1), 'same', activation='relu')) #32
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(rate=0.3))
model.add(layers.Conv2D(64, (3,3), (1,1), 'same', activation='relu')) #64
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(rate=0.3))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
^ 간단한 CNN 모델 구성
from tensorflow.keras.utils import plot_model
plot_model(model, 'model.png', show_shapes=True)
model.summary()
^ 모델 확인하기
model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['acc'])
^ 모델 설정하기
history = model.fit_generator(trainGen, epochs= 32, validation_data=testGen)
^ 모델 학습하기
import matplotlib.pyplot as plt
his_dict = history.history
loss = his_dict['loss']
val_loss = his_dict['val_loss'] # 검증 데이터가 있는 경우 ‘val_’ 수식어가 붙습니다.
epochs = range(1, len(loss) + 1)
fig = plt.figure(figsize = (10, 5))
# 훈련 및 검증 손실 그리기
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(epochs, loss, color = 'blue', label = 'train_loss')
ax1.plot(epochs, val_loss, color = 'orange', label = 'val_loss')
ax1.set_title('train and val loss')
ax1.set_xlabel('epochs')
ax1.set_ylabel('loss')
ax1.legend()
acc = his_dict['acc']
val_acc = his_dict['val_acc']
# 훈련 및 검증 정확도 그리기
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(epochs, acc, color = 'blue', label = 'train_acc')
ax2.plot(epochs, val_acc, color = 'orange', label = 'val_acc')
ax2.set_title('train and val acc')
ax2.set_xlabel('epochs')
ax2.set_ylabel('loss')
ax2.legend()
plt.show()
^ 학습결과 그리기
^ 모델 평가하기
from tensorflow.keras.preprocessing.image import array_to_img
import numpy as np
label_index = ['고양이', '강아지'] # 고양이 0번, 강아지 1번
x,y = testGen.next()
for i in range(0,3):
image = x[i]
label = y[i].astype('int')
y_prob = model.predict(image.reshape(1,64,64,3))
y_prob_class = (model.predict(image.reshape(1,64,64,3)) > 0.5).astype('int')[0][0]
print('정답: {}'.format(label_index[label]), 'label :', label)
print('예측: {}'.format(label_index[y_prob_class]), 'predicted value:', y_prob)
plt.imshow(image)
plt.show()
^ 모델 예측하기