개요
책을 보고 공부한 내용을 정리합니다.
딥러닝 텐서플로 교과서
- 저자 서지영님
- 길벗 출판사
코드 출처
https://github.com/gilbutITbook/080263
[Book]2. 텐서 플로 기초
2.1 텐서 플로 개요
텐서 플로 : 데이터 흐름 그래프를 사용해 데이터의 수치 연산을 하는 프레임 워크
인공지능에서 데이터는 벡터로 표현
텐서는 3 차원 이상의 배열 형태
2.1.1 텐서플로 특징 및 장점
- GPU, CPU를 사용하여 연산 구동 가능
- 자동 미분 계산, 역전파 과정에서 오차를 최소화하고자 편미분을 이용해 가중치를 업데이트함.
이때 미분 계산을 자동화하는 것이 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 모델 정의
- Sequential API
- Functional API
- 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 모델 컴파일
- 옵티마이저 : 데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정
- 손실 함수(loss function) : 훈련하는 동안 출력과 실제 값 사이의 오차 측정
- 지표(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 텐서 플로 맛보기
정확도
- 전체 예측 건수에서 정답을 맞힌 건수 비율
재현율(Recall)
- 실제로 정답이 1이라고 할 때 1로 예측한 비율
정밀도(Precision)
- 1이라고 예측한 것 중에서 실제로 정답이 1인 비율
F1-Score
- 정밀도와 재현율은 trade-off 관계
- 정밀도 높음 -> 재현율 낮음 , 정밀도 낮음 -> 재현율 높음
- 위와 같은 문제를 해결하기 위해 조화 평균 사용 (2* (정밀도 * 재현율) / (정밀도 + 재현율))
'Study > 딥러닝 텐서플로 교과서 - 길벗' 카테고리의 다른 글
[Book]6. 합성곱 신경망 2 (0) | 2022.01.04 |
---|---|
[Book]5. 합성곱 신경망 1 (0) | 2022.01.02 |
[Book]4. 딥러닝 시작 (0) | 2021.12.29 |
[Book]3. 머신러닝 핵심 알고리즘 (0) | 2021.12.26 |
[Book]1. 머신러닝과 딥러닝 (0) | 2021.12.24 |