본문 바로가기

Study/딥러닝 텐서플로 교과서 - 길벗

[Book]2. 텐서플로 기초

개요
책을 보고 공부한 내용을 정리합니다.


딥러닝 텐서플로 교과서

  • 저자 서지영님 
  • 길벗 출판사

코드 출처

https://github.com/gilbutITbook/080263

 

GitHub - gilbutITbook/080263

Contribute to gilbutITbook/080263 development by creating an account on GitHub.

github.com


[Book]2. 텐서 플로 기초

 

2.1 텐서 플로 개요

텐서 플로 : 데이터 흐름 그래프를 사용해 데이터의 수치 연산을 하는 프레임 워크

인공지능에서 데이터는 벡터로 표현
텐서는 3 차원 이상의 배열 형태

 

2.1.1 텐서플로 특징 및 장점

  1. GPU, CPU를 사용하여 연산 구동 가능
  2. 자동 미분 계산, 역전파 과정에서 오차를 최소화하고자 편미분을 이용해 가중치를 업데이트함.
    이때 미분 계산을 자동화하는 것이 GradientTape
텐서 플로 1.x와 2.x 버전의 실행 과정 차이점
# 텐서플로 1.x
with tf.Session() as session:
	session.run(tf.global_variables_initializer())
	session.run(tf.tables_initializer())
	model.fit(X_train, y_train, validation_data = (X_valid, y_valid),
	epochs = 10, batch_size =64)


# 텐서플로 2.x
model.fit(X_train, y_train, validation_data = (X_valid, y_valid),
						epochs = 10, batch_size= 64)​

1. 텐서 플로 1.x에서는 데이터를 훈련하려면 그래프를 만들고 플레이스 홀더를 정의한 후 세션을 실행
2. 텐서플로 2.x부터는 즉시 실행(eager exectuion)이 기본 모드로 설정되어서 매우 간단



1. 플레이스 홀더


텐서 플로는 그래프를 미리 만들어 놓고, 나중에 필요할 때 그래프를 실행하는 방식
입력 데이터(텐서)를 보관하기 위한 장소가 플레이스 홀더

import tensorflow as tf
input_data = [1, 2, 3]
x = tf.placeholder(dtype = tf.float32)
y = x * 2


2. 세션
그래프를 실행하는 단위
입력 데이터를 넣어 두기 위해 플레이스 홀더를 정의하고, 그래프가 실행되는 시점에 입력 데이터를 넣어줌
이때 그래프가 실행되는 시점을 세션이 실행되는 시점으로 이해
세션은 그래프에 [1, 2, 3] 입력 데이터를 넣어 y = x*2 연산을 수행하는 역할을 함

sess = tf.Session()
result = sess.run(y, feed_dict={x:input_data})

# 세션은 선언 -> 실행 -> 종료 순

2.2 텐서 플로 2.x 기초 문법

2.2.1 데이터 준비

데이터가 이미지인 경우

  • 분산된 파일에서 데이터 읽기 -> 전처리 -> 배치 단위로 분할하여 처리

데이터가 텍스트일 경우

  • 임베딩 -> 서로 다른 길이의 시퀀스를 배치 단위로 분할하여 처리

2.2.2 모델 정의

  1. Sequential API
  2. Functional API
  3. Model Subclassing API

Sequential API

많이 사용하기는 하지만, 단순히 층을 여러개 쌓는 형태, 복잡한 모델 생성 시 한계가 있음

from tensorflow.keras import models, Dense
model = tf.keras.sequential()

# 입력 -> layer1 -> layer2 -> layer n -> 출력 

model.add(Dense(4, activation = 'sigmoid', input_shape=(4,), weights = (w,b))

Functional API

다중 입력과 다중 출력등 복잡한 모델 정의, 입력 데이터의 크기(shape)를 input()의 파라미터로 사용

from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
inputs = Input(shape = (5,))

x = Dense(8, activation = 'relu')(inputs)  # 은닉층 1
x = Dense(4, activation = 'relu')(x)  # 은닉층 2
x = Dense(1, activation = 'relu')(x)  # 은닉층 1

Model Subclassing API

자유롭게 모델 구축

class ResNet(tf.keras.Model):
	def __init__(self):
		super(ResNet, self).__init__()
		self.block_1 = layers.Dense(32, activation = 'relu')
		self.block_2 = layers.Dense(num_classes, activation = 'sigmoid')
	
	def call(self, inputs):
		x = self.block_1(input)
		return self.block_2(x)

2.2.3 모델 컴파일

  1. 옵티마이저 :  데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정
  2. 손실 함수(loss function) : 훈련하는 동안 출력과 실제 값 사이의 오차 측정
  3. 지표(metrics) : 훈련과 검증 단계를 모니터링
model.compile(optimizer = 'adam', loss ='sparse_categorical_crossentropy',
								metrics = ['accuracy']

# 아담(adam) 옵티마이저 사용
# 다중 분류에서 사용되는 손실함수 사용
# 정확도 지표 모니터링

2.2.4 모델 훈련

앞에서 만든 데이터로 모형을 학습

학습시킨다? : y = wx+b라는 함수가 있으면 적절한 w와 b를 찾는것
model.fit(x_train, y_train, epochs =10, batch = 100, validation_data = (x_test,y_test),
							verbose =2)

2.2.5 모델 평가

검증 데이터셋을 사용하여 모델을 평가

평가가 끝나면 검증 데이터셋에 대한 손실 값과 정확도가 결과로 표시

model.evaluate(x_test, y_test, batch_size =32)

# x_test : 검증 데이터셋
# y_test : 결과 데이터셋
# batch_size : 한 번에 학습할 떄 사용하는 데이터 개수

2.3 텐서 플로 맛보기

차 상태 분류

 

GitHub - heohyunjun/Sk_Shieldus: SK Infosec 클라우드 AI 융복합 과정

SK Infosec 클라우드 AI 융복합 과정. Contribute to heohyunjun/Sk_Shieldus development by creating an account on GitHub.

github.com


정확도

  • 전체 예측 건수에서 정답을 맞힌 건수 비율

재현율(Recall)

  • 실제로 정답이 1이라고 할 때 1로 예측한 비율

정밀도(Precision)

  • 1이라고 예측한 것 중에서 실제로 정답이 1인 비율

F1-Score

  • 정밀도와 재현율은 trade-off 관계
  • 정밀도 높음 -> 재현율 낮음 , 정밀도 낮음 -> 재현율 높음
  • 위와 같은 문제를 해결하기 위해 조화 평균 사용 (2* (정밀도 * 재현율) / (정밀도 + 재현율))