티스토리 뷰
멀티캠퍼스 AI과정/06 Deep Learning
Deep Learning 07 - AWS에서 이미지 CNN 처리, cat/ dog 예제 2
jhk828 2020. 11. 2. 14:0820201102
GPU 1GB만 할당
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
# 특정 GPU에 1GB 메모리만 할당하도록 제한
try:
tf.config.experimental.set_visible_devices(gpus[1], 'GPU')
tf.config.experimental.set_virtual_device_configuration(
gpus[1],
[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024)])
except RuntimeError as e:
# 프로그램 시작시에 가상 장치가 설정되어야만 합니다
print(e)
%reset
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
train_dir = './data/cat_dog_full/train'
validation_dir = './data/cat_dog_full/validation'
# 전체데이터가 : 25,000
# 멍멍이 이미지 총 개수 : 12,500
# 멍멍이 이미지의 train : 7,000
# 멍멍이 이미지의 validation : 3,000
# 멍멍이 이미지의 test : 2,500
# ImageDataGenerator
# 이미지 데이터의 값을 1/225로 scaling
train_datagen = ImageDataGenerator(rescale=1/255)
validation_datagen = ImageDataGenerator(rescale=1/255)
# train data를 가져오면 => x_data(독립변수,픽셀데이터), t_data(종속변수,label)
train_generator = train_datagen.flow_from_directory(
train_dir, # taget directory : 데이터를 어디에서 가져올건가요!
classes=['cats', 'dogs'], # label적용을 어떻게 할건가요? 순서대로 레이블이 적용
# cats : 0, dogs : 1 (cats와 dogs는 폴더명!!)
# 만약 classes를 명시하지 않으면 폴더명 순서로 label이 잡혀요!
target_size=(150,150), # 이미지 size scaling(크기를 150x150으로 변경해서 들고와!!)
batch_size=20, # 한번에 20개의 이미지를 가져와!!
# label에 상관없이 가져와요!!
class_mode='binary' # 이진분류이기 때문에 'binary'
# 만약 MNIST처럼 다중분류면 'categorical'
# 기본값은 'categorical'
)
validation_generator = validation_datagen.flow_from_directory(
validation_dir, # taget directory : 데이터를 어디에서 가져올건가요!
classes=['cats', 'dogs'], # label적용을 어떻게 할건가요? 순서대로 레이블이 적용
# cats : 0, dogs : 1 (cats와 dogs는 폴더명!!)
# 만약 classes를 명시하지 않으면 폴더명 순서로 label이 잡혀요!
target_size=(150,150), # 이미지 size scaling(크기를 150x150으로 변경해서 들고와!!)
batch_size=20, # 한번에 20개의 이미지를 가져와!!
# label에 상관없이 가져와요!!
class_mode='binary' # 이진분류이기 때문에 'binary'
# 만약 MNIST처럼 다중분류면 'categorical'
# 기본값은 'categorical'
)
# 데이터 준비가 끝났어요!!
# 이제 모델을 만들어 보아요!!
with tf.device('/device:GPU:0'):
model = Sequential()
model.add(Conv2D(filters=32,
kernel_size=(3,3),
activation='relu',
input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64,
kernel_size=(3,3),
activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=128,
kernel_size=(3,3),
activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=128,
kernel_size=(3,3),
activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(units=512,
activation='relu'))
model.add(Dense(units=1,
activation='sigmoid'))
print(model.summary())
##########################################3
# compile - 손실함수, 옵티마이저 지정
model.compile(optimizer=Adam(learning_rate=1e-4),
loss='binary_crossentropy',
metrics=['accuracy'])
history = model.fit(train_generator,
steps_per_epoch= 700, # 1 에폭 당 generator를 몇번/ 몇번 스텝으로 가져올 지
epochs=30, # 에폭 30번
validation_data=validation_generator,
validation_steps=300 # 6000개/20번
)
model.save('./cat_dog_full_cnn_model2.h5') # 추후 학습 결과 load하여 사용
output:
Found 14000 images belonging to 2 classes.
Found 6000 images belonging to 2 classes.
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 148, 148, 32) 896
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 72, 72, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 34, 34, 128) 73856
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 128) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 15, 15, 128) 147584
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 7, 7, 128) 0
_________________________________________________________________
flatten (Flatten) (None, 6272) 0
_________________________________________________________________
dropout (Dropout) (None, 6272) 0
_________________________________________________________________
dense (Dense) (None, 512) 3211776
_________________________________________________________________
dense_1 (Dense) (None, 1) 513
=================================================================
Total params: 3,453,121
Trainable params: 3,453,121
Non-trainable params: 0
_________________________________________________________________
None
#####
poch 29/30
700/700 [==============================] - 55s 79ms/step - loss: 0.0643 - accuracy: 0.9754 - val_loss: 0.3712 - val_accuracy: 0.8880
Epoch 30/30
700/700 [==============================] - 55s 78ms/step - loss: 0.0595 - accuracy: 0.9781 - val_loss: 0.3484 - val_accuracy: 0.8862
%matplotlib inline
import matplotlib.pyplot as plt
train_acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
train_loss = history.history['loss']
val_loss = history.history['val_loss']
print('accuracy 그래프')
# 두 선의 차이가 많이 나면 오버피팅 발생
plt.plot(train_acc, 'bo', color='r', label='train acc')
plt.plot(val_acc, 'b', color='b', label='validation acc')
plt.legend()
plt.show()
print('loss 그래프')
plt.plot(train_loss,'bo', color='r', label='train loss')
plt.plot(val_loss,'b', color='b', label='validation loss')
plt.legend()
plt.show()
'멀티캠퍼스 AI과정 > 06 Deep Learning' 카테고리의 다른 글
댓글