AI - Deep Learing 3일차
학습 내용
cats and dogs 이미지 분류하기
# colab에서 드라이브에 있는 파일을 사용하기 위해 마운트
from google.colab import drive
drive.mount('/content/drive')
import keras
import os, shutil
-
분류할 폴더 생성
-
파일 복사
Copy files....
---traing file(s) (cat)....
---validation file(s) (cat)....
---test file(s) (cat)....
---traing file(s) (dog)....
---validation file(s) (dog)....
---test file(s) (dog)....
- 복사된 파일 개수 확인
print('훈련용 고양이 이미지 전체 개수:', len(os.listdir(train_cats_dir))) # 파일 전체 목록의 길이 확인
print('검증용 고양이 이미지 전체 개수:', len(os.listdir(validation_cats_dir)))
print('테스트용 고양이 이미지 전체 개수:', len(os.listdir(test_cats_dir)))
print('훈련용 강아지 이미지 전체 개수:', len(os.listdir(train_dogs_dir)))
print('검증용 강아지 이미지 전체 개수:', len(os.listdir(validation_dogs_dir)))
print('테스트용 강아지 이미지 전체 개수:', len(os.listdir(test_dogs_dir)))
훈련용 고양이 이미지 전체 개수: 1000
검증용 고양이 이미지 전체 개수: 500
테스트용 고양이 이미지 전체 개수: 500
훈련용 강아지 이미지 전체 개수: 1000
검증용 강아지 이미지 전체 개수: 500
테스트용 강아지 이미지 전체 개수: 500
- 신경망 만들기
from keras import layers
from keras import models
# 레이어 11개 생성
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten()) #이미지를 일자로 펴기
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
#이진분류할 때는 sigmoid 사용
#모델 컴파일
from tensorflow.keras import optimizers
model.compile(loss='binary_crossentropy', #둘 중 하나면 binary_crossentropy, 여러 개면 categorical_crossentropy
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
- 이미지 사이즈 통일
이미지 크기가 다르면 특성이 다르게 잡힌다
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
validation_generator = validation_datagen.flow_from_directory(
validation_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
- 학습
model.fit_generator(
train_generator,
epochs=30, #반복 횟수
steps_per_epoch=100,
validation_data=validation_generator,
validation_steps=50
)
Epoch 1/30
100/100 [==============================] - 478s 5s/step - loss: 0.6948 - acc: 0.5250 - val_loss: 0.6828 - val_acc: 0.5040
Epoch 2/30
100/100 [==============================] - 12s 124ms/step - loss: 0.6624 - acc: 0.5920 - val_loss: 0.6568 - val_acc: 0.5980
Epoch 3/30
100/100 [==============================] - 12s 123ms/step - loss: 0.6202 - acc: 0.6630 - val_loss: 0.6147 - val_acc: 0.6700
...중략...
Epoch 29/30
100/100 [==============================] - 12s 123ms/step - loss: 0.0362 - acc: 0.9900 - val_loss: 1.1306 - val_acc: 0.7200
Epoch 30/30
100/100 [==============================] - 12s 123ms/step - loss: 0.0328 - acc: 0.9900 - val_loss: 1.0944 - val_acc: 0.7310
- 모델 저장하기
model.save('cats_and_dogs_small_l.h5') #모델의 확장자 h5
- 그래프로 확인하기
history = model.history
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
# colab에서 드라이브에 있는 파일을 사용하기 위해 마운트
from google.colab import drive
drive.mount('/content/drive')
import keras
import os, shutil
분류할 폴더 생성
파일 복사
Copy files....
---traing file(s) (cat)....
---validation file(s) (cat)....
---test file(s) (cat)....
---traing file(s) (dog)....
---validation file(s) (dog)....
---test file(s) (dog)....
print('훈련용 고양이 이미지 전체 개수:', len(os.listdir(train_cats_dir))) # 파일 전체 목록의 길이 확인
print('검증용 고양이 이미지 전체 개수:', len(os.listdir(validation_cats_dir)))
print('테스트용 고양이 이미지 전체 개수:', len(os.listdir(test_cats_dir)))
print('훈련용 강아지 이미지 전체 개수:', len(os.listdir(train_dogs_dir)))
print('검증용 강아지 이미지 전체 개수:', len(os.listdir(validation_dogs_dir)))
print('테스트용 강아지 이미지 전체 개수:', len(os.listdir(test_dogs_dir)))
훈련용 고양이 이미지 전체 개수: 1000
검증용 고양이 이미지 전체 개수: 500
테스트용 고양이 이미지 전체 개수: 500
훈련용 강아지 이미지 전체 개수: 1000
검증용 강아지 이미지 전체 개수: 500
테스트용 강아지 이미지 전체 개수: 500
from keras import layers
from keras import models
# 레이어 11개 생성
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten()) #이미지를 일자로 펴기
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
#이진분류할 때는 sigmoid 사용
#모델 컴파일
from tensorflow.keras import optimizers
model.compile(loss='binary_crossentropy', #둘 중 하나면 binary_crossentropy, 여러 개면 categorical_crossentropy
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
이미지 크기가 다르면 특성이 다르게 잡힌다
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
validation_generator = validation_datagen.flow_from_directory(
validation_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
model.fit_generator(
train_generator,
epochs=30, #반복 횟수
steps_per_epoch=100,
validation_data=validation_generator,
validation_steps=50
)
Epoch 1/30
100/100 [==============================] - 478s 5s/step - loss: 0.6948 - acc: 0.5250 - val_loss: 0.6828 - val_acc: 0.5040
Epoch 2/30
100/100 [==============================] - 12s 124ms/step - loss: 0.6624 - acc: 0.5920 - val_loss: 0.6568 - val_acc: 0.5980
Epoch 3/30
100/100 [==============================] - 12s 123ms/step - loss: 0.6202 - acc: 0.6630 - val_loss: 0.6147 - val_acc: 0.6700
...중략...
Epoch 29/30
100/100 [==============================] - 12s 123ms/step - loss: 0.0362 - acc: 0.9900 - val_loss: 1.1306 - val_acc: 0.7200
Epoch 30/30
100/100 [==============================] - 12s 123ms/step - loss: 0.0328 - acc: 0.9900 - val_loss: 1.0944 - val_acc: 0.7310
model.save('cats_and_dogs_small_l.h5') #모델의 확장자 h5
history = model.history
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
학습 후기
오류가 나서 문제가 생겨야 해결법을 찾아보면서 배운다는데 오류가 안 나서 걱정이다.
오늘 한 내용을 혼자 만들어 낼 자신은 없지만 이해한 것에 만족해야겠다.
복습하는 시간이 오래 걸려서 방법을 바꿨는데 꽤 괜찮은 것 같다.
영상을 전체적으로 빠른 배속으로 보고 아는 것을 정리했었는데 오늘은 코딩한 내용을 먼저 풀이해보고 이해 못한 부분만 따로 체크해서 나중에 해당 부분만 다시 찾아보니까 모르는게 더 잘 체크되고 복습 시간도 줄었다. 덕분에 듣고 싶었던 강의도 들을 여유 시간이 생겼다.
Author And Source
이 문제에 관하여(AI - Deep Learing 3일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hanss1122/AI-Deep-Learing-3일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)