IT/ML

[Machine Learning] TensorFlow, Keras

aram 2022. 11. 3. 17:27

 

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

출처 https://codetorial.net/tensorflow/basics_of_tensor.html

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

출처 : https://yamerong.tistory.com/68

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: 다음 층으로 어떻게 값을 넘길지 결정하는 부분(가장 많이 사용되는 relusigmoid 함수) 
      > 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])

 

728x90