Deep Learning : 연결주의 학파 알고리즘
[ keras ]
1. Sequential
- Dense( ) -> Fully Connected 구조
- Flatten( ) -> 쫘아악 펼쳐줌
2. Functional
Q. Fully Connected 구조에서는 이미지 문제를 어떻게 풀었을까?
ans) 2차원 이미지를 Flatten ( MNIST -흑백, 28x28x1)
[CIFAR - 10/100]
-> 이미지 구조를 살린 채로 문제를 풀 수 없을까?
-> Convolutional Neural Network
Conv2D
- filters = 32 -> 새롭게 제작하려는 feature map의 수
- kernel_size = (3,3) -> 필터의 가로세로 사이즈
- strides = (1,1) -> 필터의 이동 보폭
- padding = 'same' -> 1. feature map의 사이즈 유지 / 2. 외곽의 정보를 조금이라도 더 반영하려고
- activation = 'relu' -> (relu와 Max가 잘 엮여서 사용되었음! )
Maxpool2D
- Pool_size =(2,2) -> 풀링 필터의 가로세로 사이즈
- Strides = (2,2) -> 풀링 필터의 이동 보폭
AvgPool2D
- 특징을 더 고르게 반영
- LeNet - 5
Feature Representation
: 연결된 것으로부터 기존에 없던 feature를 재표현/생성함.
CNN에서 Feature Representation 이란?
: 위치 정보를 보존한 채로 feature를 represent 한 것.
잘 학습된 CNN의 특징 (대회: Image Net)
1. 유용한 feature를 추출
2. 위치 정보를 보존
AlexNet, VGG, Google Net, ResNet
=> Object Detection 모델의 앞단에 쓰임 (Backbone)
Object Detection 핵심 근간
1. Bounding Box
- 하나의 Object가 포함된 최소 크기의 Box
- 구성요소: x, y, w, h (좌표+ 크기=위치정보)
- 모델이 예측한 Bounding Box: Predicted Bounding Box
2. Classification
- 어떤 클래스인지 분류
3. Confidence Score
- Object가 Bounding Box 안에 있는지에 대한 확신의 정도
회귀 | 이진분류 | 다중분류 | |
Output Activation | x | sigmoid | softmax |
loss | mse | binary _ crossentropy | categorical_crossentropy |
Roboflow
!pip install roboflow
from roboflow import Roboflow
rf = Roboflow(api_key="사용자마다 다름!")
project = rf.workspace("roboflow-universe-projects").project("construction-site-safety")
version = project.version(30)
dataset = version.download("yolov8")
!pip install ultralytics
from ultralytics import YOLO, settings
settings
=> 출력 값
{'settings_version': '0.0.4',
'datasets_dir': '/content/datasets',
'weights_dir': 'weights',
'runs_dir': 'runs',
'uuid': '569f3ba64b326db489132663f79cd37279811de477381b83ac131e6cdd129cbb',
'sync': True,
'api_key': '',
'openai_api_key': '',
'clearml': True,
'comet': True,
'dvc': True,
'hub': True,
'mlflow': True,
'neptune': True,
'raytune': True,
'tensorboard': True,
'wandb': True}
- settings의 dataset_dir은 기본적으로 '/content/datasets/'로 되어있음
#datasets 폴더 제거
settings['datasets_dir'] = '/content/'
# 모델 선언
# yolov8n.pt 불러옴
model = YOLO()
model.train(model='/content/yolov8n.pt',
data='/content/Construction-Site-Safety-30/data.yaml',
epochs= 100,
)
data.yaml
- 에러를 방지하기 위해 경로 수정
train: ./train/images
val: ./valid/images
model.predict(source='/content/Construction-Site-Safety-30/test/images',
conf=0.25,
iou=0.7,
save=True,
)
# 결과: runs/detect/predict
Keras로 CNN 문제 풀어보기
- Fully connected 구조와 CNN 구조의 성능 비교
!pip install --upgrade keras
# 외부 keras 사용
import os
os.environ['BACKEND'] = 'tensorflow' ## PyTorch, JAX도 가능
import keras
keras.__version__
# 3.2.1
CIFAR-10
- 32 X 32 X 3의 해상도의 사물 데이터를 모아 놓은 데이터 세트
- CIFAR-10 데이터 세트는 비행기(airplane), 자동차(automobile), 새(bird), 고양이(cat) 등 총 10개의 클래스로 구성
- 학습 데이터는 50,000개이고, 테스트 데이터는 10,000개다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import keras
(train_x, train_y), (test_x, test_y) = keras.datasets.cifar10.load_data()
train_x.shape, train_y.shape, test_x.shape, test_y.shape
labels = {0: 'Airplane',
1: 'Automobile',
2: 'Bird',
3: 'Cat',
4: 'Deer',
5: 'Dog',
6: 'Frog',
7: 'Horse',
8: 'Ship',
9: 'Truck',
}
labels
id = np.random.randint(0, 10000)
print(f'id = {id}')
print(f'다음 그림은 {labels[test_y[id][0]]}')
plt.imshow(test_x[id])
plt.show()
=> 출력값
id = 1716
다음 그림은 Automobile
Modeling I ( Fully connected )
import keras
from keras.utils import clear_session
from keras.models import Sequential
from keras.layers import Input, Dense, Flatten
# 1. 메모리 청소
clear_session()
# 2. 모델 선언 : 리스트 안에 추가하는 방식
model1 = Sequential([Input(shape=(32,32,3)),
keras.layers.Rescaling(1/255),
Flatten(),
Dense(64, activation='relu'),
Dense(64, activation='relu'),
Dense(128, activation='relu'),
Dense(128, activation='relu'),
Dense(256, activation='relu'),
Dense(256, activation='relu'),
Dense(10, activation='softmax'),
])
# 3. 레이어 블록 조립: .add() 방식
# model1.add( Input(shape=(32,32,3)) )
# model1.add( keras.layers.Rescaling(1/255) )
# model1.add( Flatten() )
# model1.add( Dense(64, activation='relu'))
# model1.add( Dense(64, activation='relu'))
# model1.add( Dense(128, activation='relu') )
# model1.add( Dense(128, activation='relu') )
# model1.add( Dense(256, activation='relu') )
# model1.add( Dense(256, activation='relu') )
# model1.add( Dense(10, activation='softmax') )
# 4. 컴파일
model1.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
model1.summary()
from keras.callbacks import EarlyStopping # 과적합 방지
es = EarlyStopping(monitor='val_loss', # 얼시스토핑을 적용할 관측 지표
min_delta=0, # 임계값
patience=5, # 성능 개선이 발생하지 않았을 때, 몇 epochs 더 지켜볼 것인지
verbose=1, # 몇 번째 epochs에서 얼리스토핑이 되었는가 알려줌
restore_best_weights=True # 최적의 가중치를 가진 epoch 시점으로 가중치를 되돌림
)
model1.fit(train_x, train_y, validation_split=0.2,
epochs = 10000, verbose =1,
callbacks=[es]
)
y_pred = model1.predict(test_x)
model1.evaluate(test_x, test_y)
Modeling II ( CNN )
import keras
from keras.utils import clear_session
from keras.models import Sequential
from keras.layers import Input, Dense, Flatten
from keras.layers import Conv2D, MaxPool2D
# 1. 메모리 청소
clear_session()
# 2. 모델 선언 : 리스트 안에 넣는 방식
model2 = Sequential([Input(shape=(32,32,3)),
keras.layers.Rescaling(1/255),
Conv2D(filters=64, # 서로 다른 필터 64개를 사용하겠다.
kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
strides=(1,1), # Conv2D 필터의 이동 보폭
padding='same', # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
activation='relu', # 주의!
),
Conv2D(filters=64, # 서로 다른 필터 64개를 사용하겠다.
kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
strides=(1,1), # Conv2D 필터의 이동 보폭
padding='same', # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
activation='relu', # 주의!
),
MaxPool2D(pool_size=(2,2),# pooling 필터의 가로 세로 사이즈
strides=(2,2) # pooling 필터의 이동 보폭 (기본적으로 pool_size를 따름)
),
Conv2D(filters=128, # 서로 다른 필터 64개를 사용하겠다.
kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
strides=(1,1), # Conv2D 필터의 이동 보폭
padding='same', # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
activation='relu', # 주의!
),
Conv2D(filters=128, # 서로 다른 필터 64개를 사용하겠다.
kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
strides=(1,1), # Conv2D 필터의 이동 보폭
padding='same', # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
activation='relu', # 주의!
),
MaxPool2D(pool_size=(2,2),# pooling 필터의 가로 세로 사이즈
strides=(2,2) # pooling 필터의 이동 보폭 (기본적으로 pool_size를 따름)
),
Conv2D(filters=256, # 서로 다른 필터 64개를 사용하겠다.
kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
strides=(1,1), # Conv2D 필터의 이동 보폭
padding='same', # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
activation='relu', # 주의!
),
Conv2D(filters=256, # 서로 다른 필터 64개를 사용하겠다.
kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
strides=(1,1), # Conv2D 필터의 이동 보폭
padding='same', # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
activation='relu', # 주의!
),
MaxPool2D(pool_size=(2,2),# pooling 필터의 가로 세로 사이즈
strides=(2,2) # pooling 필터의 이동 보폭 (기본적으로 pool_size를 따름)
),
Flatten(),
Dense(10, activation='softmax')
])
# 3. 컴파일
model2.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
model2.summary()
model2.fit(train_x, train_y, validation_split=0.2,
epochs=10000, verbose = 1,
callbacks=[es],
)
y_pred2 = model2.predict(test_x)
model2.evaluate(test_x, test_y)
'KT AIVLE' 카테고리의 다른 글
KT AIVLE(KT 에이블스쿨) 5기 DX트랙_ 딥러닝 심화_언어 모델 이해 (1) | 2024.04.20 |
---|---|
KT AIVLE(KT 에이블스쿨) 5기 DX트랙_ 딥러닝 심화_실습 및 언어 모델 활용 (1) | 2024.04.18 |
KT AIVLE(KT 에이블스쿨) 5기 DX트랙_ 딥러닝 심화_시각지능 (0) | 2024.04.16 |
KT AIVLE(KT 에이블스쿨) 5기 DX트랙_ 딥러닝 기초_CNN (0) | 2024.04.15 |
KT AIVLE(KT 에이블스쿨) 5기 DX트랙_ 딥러닝 기초 (0) | 2024.04.13 |