티스토리 뷰

20201102

 

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()

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함