728x90
반응형
DL 시작 전 가상환경 새로 생성하기
1. conda 업데이트
> conda update -n base conda
2. pip 업데이트
> python -m pip install --upgrade pip
3. 가상환경 생성하기
> conda create -n gj_env_ python=3.9
4. 가상환경으로 들어가기(활성화시키기)
> conda activate gj_env_dl
5. 외부 에디터에서 가상환경 연결(kernel) 하기 위하여 jupyter 설치하기
> pip install jupyter notebook
6. 커널 생성하기 (base root 가상환경에서 진행)
> python -m ipykernel install --user --name gj_env_dl --display-name gj_env_dl_kernel
7. 커널 생성 목록 확인하기
> jupyter kernelspec list
8. 기본 패키지 설치하기( gj_env_dl에서 진행)
> pip install ipython jupyter matplotlib pandas xlrd seaborn scikit-learn
> pip install openpyxl
> pip install folium (지도 시각화)
> pip install plotly (시각화)
> pip install xgboost (머신러닝 앙상블 분류모델)
> pip install nltk (자연어처리)
> pip install wordcloud
> pip install JPype1
> pip install konlpy (/anaconda3/envs/gj_env_dl/Lib/site-packages/konlpy/jvm.py에서 별(*) 표시 삭제)
9. 딥러닝 - 텐서플로우 설치하기( 텐서플로우 설치 후 numpy 설치하면 충돌 난다. 텐서플로우의 numpy가 따로 있다.)
> pip install tensorflow==2.8.2
10. 딥러닝 - 모델 시각화 라이브러리
> conda install -c conda-forge pydot graphviz
Tensorflow 정상적으로 설치되었는지 확인
> python
>>> from tensorflow import keras
>>> from tensorflow.keras.layers import Dense
>>> dns = keras.Sequential()
>>> dns.add(Dense(units=1, input_shape(1,)))
>>> dns.compile(optimizer="sgd", loss="mse")
>>> dns.summary()
인공신경망 훈련 모델 맛보기
🏓라이브러리 불러오기
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
🏓랜덤 고정값 설정
''' 실행 결과를 동일하게 하기 위한 처리(완전 동일하지 않을 수도 있음) '''
tf.keras.utils.set_random_seed(42)
''' 연산 고정 '''
tf.config.experimental.enable_op_determinism()
데이터 수집
'''
- keras에서 제공해주는 이미지 데이터셋 사용
- MNIST 패션 이미지
- 이미지 데이터는 픽셀 데이터로 이루어져 있다.
'''
# 튜플(독립변수 종속변수) 안에 튜플(훈련데이터, 테스트데이터) 안에 array
(train_input, train_target), (test_train, test_target) = keras.datasets.fashion_mnist.load_data()
print(train_input.shape, train_target.shape)
print(test_train.shape, test_target.shape)
''' 이미지 1개에 대한 데이터 추출
- 각 데이터는 픽셀값(색상값)
- 픽셀값(색상값)은 0 ~ 255 (총 256개의 값드로 구성되어 있음)
'''
train_input[0]
훈련데이터 10개만 이용해서 데이터를 이미지로 시각화하기
''' 서브플롯 사용 : 이미지 10개를 하나로 시각화 '''
fig, axs = plt.subplots(1, 10, figsize=(10, 10))
''' 훈련데이터 10개에 대한 처리 '''
for i in range(10) :
''' 픽셀데이터를 이미지로 시각화 : imshow() '''
axs[i].imshow(train_input[i], cmap="gray_r")
''' x, y 좌표계 숨기기 '''
axs[i].axis("off")
plt.show()
''' 종속변수 10개 추출해서 매핑된 값 확인해보기 '''
train_target[:10]
''' 종속변수의 범주값 확인하기 '''
np.unique(train_target, return_counts=True)
데이터 스케일링
- 사용되는 데이터의 특성상 0부터 255까지의 값을 가지고 있음
- 값의 범위 폭이 크기 때문에 일반화(데이터 스케일링)하여 사용
- 데이터 스케일링을 수행하는 방법으로 라이브러리를 사용해도 되며, 값의 최댓값을 이용해서 산술 연산을 이용해 데이터 스케일링해도 된다.
- 데이터 스케일링 수행하기
train_scaled_255 = train_input / 255.0
train_scaled_255[0]
test_scaled_255 = test_input / 255.0
test_scaled_255[0]
train_scaled_255.shape, test_scaled_255.shape
- 모델 훈련에 사용하기 위해서는 2차원으로 변환 필요
train_scaled_2d = train_scaled_255.reshape(-1, 28*28)
train_scaled_2d.shape
훈련 : 검증 데이터로 분리 (8:2)
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled_2d,
train_target,
test_size=0.2,
random_state=42)
print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)
인공신경망 모델 훈련시키기 위한 단계
🏓 딥러닝은 계층 구조의 모델로 구성됨
🏓 2. 인공신경망 계층(layer) 생성하기
- Dense
→ 딥러닝에서 가장 기본적인 계층
→ 모델에 넣어서 훈련을 수행하게 된다. - 딥러닝에서 사용하는 용어
→ 특성 : 뉴런이라고도 칭한다.
→ 크기 : 갯수를 의미한다. - 딥러닝에서 사용되는 숫자들의 범위
→ 일반적으로 딥러닝에서는 숫자의 범위를 16 ~ 512 또는 32 ~ 512로 사용한다.
→ 높이와 너비를 나타내는 숫자가 있는 경우에는 3x3 또는 5x5를 주로 사용한다. - 모델에는 여러개의 계층(layer)이 사용될 수 있다.
- 첫번째 계층
→ 입력 계층(Input layer)이라고 칭한다.
→ 입력 계층에는 input_shape()가 정의된다.
→ input_shape()에는 독립변수의 열갯수를 정의한다
→ 모델에서 한개의 계층만 사용되는 경우에는 입력 계층이 곧, 출력 계층의 역할까지 수행한다.
>> 이 경우에는 출력 크기는 종속변수의 범주 갯수를 정의한다.
- 중간 계층
→ 은닉 계층(Hidden layer)이라고 칭한다.
→ 은닉 계층은 여러개 사용된다.
→ 은닉 계층의 출력 크기(갯수)는 일정하지 않다.
→ 출력 크기(갯수)는 사람이 정한다.
→ 출력 크기(갯수)는 다음 은닉계층이 입력 크기(갯수)로 받아서 훈련을 이어가는 방식이다. - 마지막 계층
→ 출력 계층(Output layer)이라고 칭한다.
→ 출력 계층에 사용되는 출력 크기는 종속변수의 범주 갯수를 정의한다.
- 첫번째 계층
- units : 특정 계층에서의 출력의 크기(갯수), 결과갯수
→ 딥러닝 모델에는 계층이 여러개 사용될 수 있으며, 마지막 계층에는 units의 갯수는 종속변수 범주의 갯수를 사용한다.
→ 중간에 사용되는 계층을 은닉계층(hidden layer)이라고 칭하며, 중간에 사용되는 계층 간에는 출력 크기를 넘겨받아서 사용된다.
→ 중간 계층의 출력 크기에 따라서 성능에 영향을 미칠 수도 있기 때문에 하이퍼파라미터 튜닝을 진행하는 경우도 있다.
→ 하이퍼파라미터 튜닝은 값을 바꾸면서 여러번 시도하는 방식을 따른다.
- kernel_initializer : 가중치를 초기화하는 방법을 지정
→ 가중치 : 손실을 최소화하기 위해서 모델이 훈련을 반복하는 과정에서 스스로 조정하는 값을 의미함
→ 가중치 초기화 방법 : uniform, normal 방법이 있음
* uniform : 균일 분포 방법
* normal : 가우시안 분포(정규 분포) 방법 - activation : 활성화 함수라고 칭한다.
→ 훈련 시 입력된 특성(뉴런)의 크기를 어떤 형태의 크기로 변환할지를 결정하는 방법 정의
→ 출력계층(Output Layer)에는 해당 종속변수의 특성에 따라 결정됨
>> 선형형태인 회귀분석의 경우 linear 사용
>> 범주형태의 분류분석인 경우 Sigmoid, Softmax, ReLU, Tanh, Leaky ReLU 등 사용
> 이진분류 : Sigmoid, ReLU, Tanh, Leaky ReLU
> 다중분류 : Softmax
→ 입력계층 또는 은닉계층에는 Sigmoid, Softmax, ReLU, Tanh, Leaky ReLU 등이 사용됨
dense = keras.layers.Dense(units=10,
kernel_initializer="uniform",
activation="softmax",
input_shape=(784, )
)
dense
🏓 1. 인공신경망 모델 생성하기
model = keras.Sequential(dense)
model
🏓 3 . 모델 설정 단계
- loss
→ 손실을 줄이기 위해 사용되는 함수 정의
→ 손실함수에는 categorical_crossentropy, binary_crossentropy, sparse_categorical_crossentropy 가 있음
- categorical_crossentropy : 다중분류 손실함수
→ 종속변수의 데이터 값이 원-핫인코딩된 형태로 되어있는 경우 사용
→ 예시 데이터 : [[0, 1, 0], [0, 0, 1], [0, 1, 0], ...] - sparse_categorical_crossentropy : 다중분류 손실함수
→ 종속변수의 데이터 값이 숫자값으로 3개 이상으로 되어있는 경우 사용
→ 예시 데이터 : [0, 1, 2, 3, 4, ... ] - binary_crossentropy : 이진분류 손실함수
→ 종속변수의 데이터 값이 숫자값으로 2개 정의되어 있는 경우
→ 예시 데이터 : [0, 1, 1, 0, 0, 1, ... ]
- categorical_crossentropy : 다중분류 손실함수
model.compile(
### 손실함수 : 종속변수의 형태에 따라 결정 됨
loss="sparse_categorical_crossentropy",
### 훈련 시 출력할 값 : 정확도 출력
metrics="accuracy"
)
💡categorical_crossentropy와 관련한 원-핫 인코딩 예제
import numpy as np
from tensorflow.keras.utils import to_categorical
### 임의 데이터 생성
# - randint() : 랜덤하게 정수값을 생성하는 함수
# --> 첫번째 인자 : 범주의 범위(0~2까지로 3개의 범주를 의미함)
# --> 두번째 인자 : 몇 개의 랜덤한 범주값을 만들지에 대한 값(10개 생성)
labels = np.random.randint(3, size=(10,))
labels
### 원-핫 인코딩(One-Hot Encoding) 하기
# - to_categorical() : 각각의 값을 범주의 갯수만큼의 리스트로 데이터 생성
# : 리스트 내 데이터에서 1이 있는 곳의 인덱스 위치값은 실제 labels의 값과 동일
# - num_classes : unique한 범주의 갯수 정의
one_hot_labels = to_categorical(labels, num_classes=3)
labels, one_hot_labels.shape, one_hot_labels
🏓 4. 모델 훈련시키기
''' epochs : 훈련 반복 횟수(손실함수의 손실률을 계속 줄여나가면서 반복함) '''
# model.fit(train_scaled, train_target, epochs=100)
# 정확도가 거의 유사하다면 손실률이 작은 것을 선택한다.
# 91번 loss: 0.4116 - accuracy: 0.8772 와 98번 loss: 0.4140 - accuracy: 0.8774를 비교했을 때 91번 선택
model.fit(train_scaled, train_target, epochs=91)
🏓 5. 모델 성능 검증하기
score = model.evaluate(val_scaled, val_target)
score
인공신경망 모델 훈련 순서
- 모델 생성 (또는 계층 생성)
- 계층 생성 (또는 모델 생성)
- 모델 설정 (compile)
- 모델 훈련 시키기(fit)
- 성능평가(검증, evaluate)
성능 개선 방법
- 데이터 증가 시키기
- 하이퍼파라미터 튜닝(일반적으로 딥러닝에서는 디폴트 값을 사용해도 됨)
→ 성능이 현저히 낮은 경우에는 튜닝 필요 - 계층을 추가 또는 제거
모델에서 사용한 계층 확인하기
'''
- Output Shape() : 출력 크기 (10개 출력)
- Param : 계층이 훈련 중에 사용한 총 특성의 갯수
-> Dense() 계층 계산공식 = (입력크기 + 1) * 출력크기
= (784 + 1) * 10 = 7850
'''
model.summary()
# dense계층에서 훈련시킴
은닉계층(Hidden Layer) 추가하기
model.add(
keras.layers.Dense(
10,
kernel_initializer="uniform",
activation="relu",
input_shape=(784, )
)
)
# 훈련
model.fit(train_scaled, train_target, epochs=50)
# 검증
model.evaluate(val_scaled, val_target)
model.summary()
첫 dense에서 나온 출력 값 10이 그대로 dense_2로 이 입력값으로 들어감.
dense_2의 Param이 110인 이유?
(10+ 1) * 10 = 110
728x90
반응형
'Digital Boot > 인공지능' 카테고리의 다른 글
[인공지능][DL] Deep Learning 실습 - 신경망계층 추가방법 및 성능향상방법 (1) | 2024.01.03 |
---|---|
[인공지능][DL] Deep Learning - 신경망계층 추가방법 및 성능향상방법 (1) | 2024.01.03 |
[인공지능][ML] Machine Learning - 모델 저장하기 및 불러오기 (0) | 2023.12.29 |
[인공지능][ML] Machine Learning - 군집모델 / 군집분석 / 주성분분석(PCA) (0) | 2023.12.28 |
[인공지능][ML] Machine Learning - 분류모델 선정하기 / GridSearchCV / 특성중요도 (0) | 2023.12.27 |