[Machine Learning] TensorFlow, Keras
TensorFlow
- 구글이 공개한 대규모 숫자 계산을 해주는 머신러닝 및 딥러닝 라이브러리 플랫폼
- 상업적인 용도 사용 가능한 오픈소스
- 오버헤드 거의 없는 구조
- Tensor 정의하고 연산 수행하도록하는 프레임워크(Framwork)
Module: tf | TensorFlow v2.12.0
## TensorFlow
www.tensorflow.org
Tensor?
- 다차원 배열 (Multi-dimensional Array)
- TensorFolw의 가장 중요한 객체
- 사용하는 자료형, 데이터의 형태(N차원의 배열)
tf.rank()
- 텐서(Tensor) 객체의 차원의 수(n-dimension) 반환 함수
- tf.rank(scalar | vector | matrix | tensor) : 랭크 0,1,2,3을 가짐
- 동의어 order, degree, n-dimension
tf.constant()
- 상수 텐서를 만드는 함수
- dtype, shape 속성 : 텐서 (Tensor)의 자료형과 형태 반환
ex) tf.constant([3, 4, 5]) / print(c.dtype, c.shape)
tf.zeros()
- 모든 요소가 0인 텐서를 만드는 함수
- 인수: 생성될 Tensor의 구조 (shape) ex) tf.zeros([2, 3])
tf.ones()
- 모든 요소가 1인 텐서를 만드는 함수
- 인수: 생성될 Tensor의 구조 (shape) ex) tf.ones(3)
tf.range()
- 파이썬의 range()와 유사
- 주어진 범위와 간격을 갖는 숫자들의 시퀀스 반환
tf.linspace()
- numpy.linspace() 와 유사
- 주어진 범위를 균일한 간격으로 나누는 숫자의 시퀀스 반환
tf.math
a = tf.add(1,2) #tf.Tensor(3, shape=(), dtype=int32)
b = tf.subtract(10,5) #tf.Tensor(5, shape=(), dtype=int32)
c = tf.square(3) #tf.Tensor(9, shape=(), dtype=int32)
d = tf.reduce_sum([1,2,3]) #tf.Tensor(6, shape=(), dtype=int32)
e = tf.reduce_mean([1,2,3]) #tf.Tensor(2, shape=(), dtype=int32)
Module: tf.math | TensorFlow v2.12.0
Math Operations.
www.tensorflow.org
텐서플로우의 Data Flow Graph Computation
- Data Flow Graph : 노드를 연결하는 엣지가 데이터를 / 노드는 데이터를 통해 수행하는 연산 역할을 하는 그래프 구조
- 엣지(Edge) = 텐서
노드(Node) = 곱하고, 나누는 등 텐서를 처리하는 연산
엣지의 방향 = 텐서의 흐름 - Data Flow Graph Computation : 데이터가 edge역할을 하여 node로 흘러가는 그래프 구조를 갖으며 node에 지정된 연산을 하는 연산방법
- 참고 : https://yamerong.tistory.com/68
- https://www.tensorflow.org/guide/intro_to_graphs?hl=ko
tf.constant([1, 2, 3]).numpy()
- 텐서 (Tensor)를 넘파이 배열로 변환하는 함수
> Tensor는 GPU, TPU와 같은 가속기에서 사용, 값 변경 불가
Keras
- 딥러닝 패키지를 편리하게 사용하기 위해 만들어진 패키지
- 구동 전 텐서플로(TensorFlow) 또는 씨아노(theano)라는 두 가지 라이브러리 중 하나가 미리 설치 필수
- Numpy 배열 데이터를 전달해야 함
keras.Sequential()
- 순차적으로 층을 쌓은 신경망 모델
- 인공 신경망을 딥러닝구조(MLP, DNN)를 한 층 한 층 쉽게 쌓아올릴 수 있게 해주는 keras API객체
- 각각의 층을 model.add()로 추가
Dense(출력 뉴런의 수, activation=활성화함수 , loss=손실함수, optimizer=최적화함수, ....)
- 모델에 포함된 완전 연결층
- 각 층이 각각 어떤 특성을 가질지 옵션을 설정하는 역할
- 은닉층과 출력층 구성
- activation: 다음 층으로 어떻게 값을 넘길지 결정하는 부분(가장 많이 사용되는 relu와 sigmoid 함수)
> relu : 은닉층 주로 사용
> sigmoid : 이진 분류 문제
> softmax : 다중 클래스 분류 문제 - loss: 신경망 모델 구축하는 compile함수에서 한 번 신경망이 실행될 때마다 오차 값을 추적하는 함수 설정 파라미터
- optimizer(최적화 함수): 오차를 어떻게 줄여 나갈지 정하는 함수(손실값으로부터 모델 업데이트)
- units: 뉴런 또는 출력 노드의 개수
- input_shape: 입력 데이터의 형태를 결정
- input_dim : 입력 뉴런의 수
Dropout()
- weight decay(가중치 감소) : 학습 중 가중치가 큰 것에 패널티 부과 >> 과적합 위헙 줄임
- Dropout : 위 만으로는 과적합 피하기 어려울 경우 뉴런 연결을 임의 삭제 >> 신호 전달x
model.compile(loss= , optimizer= )
- 모델 학습에 필요한 손실함수(얼마나 잘 예측?)와 최적화함수(개선된 예측값) 결정
model.compile(loss='mean_squared_error', optimizer='sgd') #경사하강법
model.fit(x_train, y_traun, epochs= , batch_size=n , validation_split= , callbacks= , verbose= , ...)
- 주어진 데이터에 지정 횟수 만큼 Neural Network 훈련
- 에포크 (epoch) : 주어진 데이터를 한 번 훈련하는 단위
- batch_size : 랜덤하게 1번할 때 n개 추출
- callbacks=[EarlyStopping(monitor='val_loss', patience=2)]
> 개선 여지x 이면 학습 종료시킴
> val_loss : 에포크 횟수 증가 시 감소하다가 다시 증가 == 과적합 - History 객체를 반환
model.predict()
- 특정 입력값에 대한 예측(출력)값 얻을 수 있음
model.evaluate()
- 딥러닝의 모델이 어느 정도 정확하게 예측하는지를 점검하는 함수
- 예측값과 관측값 사이의 손실값을 반환
history.history()
- 훈련 과정의 손실값 (loss values)과 지표 (metrics)를 포함
#다층 신경망 (MLP)
- input layer와 output layer 사이의 hidden layer 구성됨
DNN
- hidden layer가 2개 이상 구성되면
- 실습 : https://dailystudy.tistory.com/131
- 추가 실습 예시
# Keras이용 BMI 판정
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.callbacks import EarlyStopping
import pandas as pd, numpy as np
# BMI 데이터를 읽어 들이고 정규화하기
csv = pd.read_csv("bmi.csv")
#print(csv.info())
# 몸무게와 키 데이터(정규화처리)
csv["weight"] /= 100
csv["height"] /= 200
X = csv[["weight", "height"]].values
# 레이블
bclass = {"thin":[1,0,0], "normal":[0,1,0], "fat":[0,0,1]} y = np.empty((20000,3))
for i, v in enumerate(csv["label"]):
y[i] = bclass[v]
# 훈련 전용 데이터와 테스트 전용 데이터로 나누기
X_train, y_train = X[1:15001], y[1:15001] X_test, y_test = X[15001:20001], y[15001:20001]
# 모델 구조 정의하기
model = Sequential()
model.add(Dense(512, input_shape=(2,)))
model.add(Activation('relu'))
model.add(Dropout(0.1)) #일부러 10% 정도 끊어서 학습x
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(3)) #마지막 출력 3개 = 분류분석
model.add(Activation('softmax'))
# 모델 구축하기
model.compile( loss='categorical_crossentropy', optimizer="rmsprop", metrics=['accuracy'])
# 데이터 훈련하기
hist = model.fit( X_train, y_train,
batch_size=100, #랜덤하게 1번할 때 100개 추출
epochs=20, #학습은 20번만
validation_split=0.1,
callbacks=[EarlyStopping(monitor='val_loss', patience=2)], #검증
verbose=1)
# 테스트 데이터로 평가하기
score = model.evaluate(X_test, y_test)
print('loss=', score[0])
print('accuracy=', score[1])