https://github.com/solaris33/deep-learning-tensorflow-book-code.git
GitHub - solaris33/deep-learning-tensorflow-book-code: [『텐서플로로 배우는 딥러닝』, 솔라리스, 영진닷컴, 2
[『텐서플로로 배우는 딥러닝』, 솔라리스, 영진닷컴, 2018] 도서의 소스코드입니다. Contribute to solaris33/deep-learning-tensorflow-book-code development by creating an account on GitHub.
github.com
3.1 텐서플로의 기초 - 그래프 생성과 그래프 실행
1. 텐서플로 = 텐서를 흘려보내면서 데이터를 처리하는 라이브러리
텐서 : 다차원 배열
랭크 : 텐서의 차원 (랭크 0 : 스칼라 , 랭크 1 : 벡터, 랭크 2 : 행렬 , 랭크 3 이상이면 텐서)
(예)
3 #랭크 0 텐서; shape [] 스칼라
[1., 2., 3.] #랭크 1 텐서; shape [3] 벡터
[[1., 2., 3.], [4., 5., 6.]] # 랭크 2 텐서; shape [2, 3] 행렬
import tensorflow as tf
# 그래프 노드를 정의하고 출력합니다.
# 출력값 : <tf.Tensor: id=0, shape=(), dtype=float32, numpy=3.0>, <tf.Tensor: id=1, shape=(), dtype=float32, numpy=4.0>
node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0) # 암시적으로 tf.float32 타입으로 선언될 것입니다.
print(node1, node2)
# 그래프를 실행합니다.
# 출력값 : [3.0, 4.0]
print(node1.numpy(), node2.numpy())
# 두개의 노드의 값을 더하는 연산을 수행하는 node3을 정의합니다.
# 출력값:
# node3: <tf.Tensor: id=2, shape=(), dtype=float32, numpy=7.0>
# node3.numpy(): 7.0
node3 = tf.add(node1, node2)
print("node3:", node3)
print("node3.numpy():", node3.numpy())
- tf.float32: 변수의 data type을 의미한다.
float32는 32bits를 사용하고 float64는 64bits를 사용한다는 것인데, 이는 즉 메모리 용량 차이가 두배이다.
메모리 사용량이 두 배 차이 나므로 float64를 사용하면 연산속도가 느려질 수 있다.
하지만 float64는 float32에 비해 훨씬 정확하게 숫자를 나타낼 수 있으며 훨씬 큰 숫자도 나타낼 수 있다.
출처
Tensorflow - float32 쓰는 이유
import tensorflow as tf X = tf.placeholder(tf.float32, [None, 28*28]) Tensorflow를 공부하다 보면 위와 같이 float32를 쓴다. 왜 굳이 float32를 쓰는가에 대해 알아보려고 한다. * 코드설명 - tf.placeholder: 재료를 담는 그
keepdev.tistory.com
3.2 플레이스 홀더, 변수
import tensorflow as tf
import numpy as np
# 2개의 값을 더하는 function을 정의합니다.
@tf.function
def add_two_values(x, y):
return x + y
# 세션을 열고 그래프를 실행합니다.
# 출력값 :
# 7.5
# [ 3. 7.]
print(add_two_values(3, 4.5).numpy())
print(add_two_values(np.array([1, 3]), np.array([2, 4])).numpy())
# 노드를 추가해서 더 복잡한 그래프 형태를 만들어봅시다.
@tf.function
def add_two_values_and_multiply_three(x, y):
return 3 * add_two_values(x, y)
# 출력값 : 22.5
print(add_two_values_and_multiply_three(3, 4.5).numpy())
3.3 머신러닝 선형회귀 모델
회귀 : 어떤 실수 값을 예측하는 문제
만약 예측하는 값이 실수값이 아니라 이산값(0, 1, 2, 3 ...)이라면 이런 문제는 "분류"라고 부른다.
* 모든 머신러닝 모델은 다음 3가지의 과정을 거친다.
1. 학습하고자 하는 가설 h(θ)을 수학적 표현식으로 나타낸다. (모델 정의)
2. 가설의 성능을 측정할 수 있는 손실 함수 J(θ)을 정의한다. (손실 함수 정의)
3. 손실 함수 J(θ)을 최소화할 수 있는 학습 알고리즘을 설계한다. (옵티마이저 정의)
[1] 가설을 y = Wx + b 선형 함수의 형태로 표현함
x, y : 인풋데이터, 타겟 데이터 (플레이스 홀더 노드 선언)
W, b : 파라미터 θ > 트레이닝 데이터로부터 학습을 통해 적절한 값을 찾아내야만 하는 값 (변수 노드를 선언)
[2] 가장 대표적인 손실함수는 평균제곱오차(MSE) : 예측값이 실제 타겟값과 가까울수록 작은 값을 갖게 됨
손실함수는 목적에 가까운 형태로 파라미터가 최적화 되었을 때, (모델이 잘 학습되었을 때) 더 작은 값을 갖는 특성을 가짐
= 비용 함수
[3] 최적화 기법 (파라미터를 적절한 값으로 업데이트 하는 알고리즘) , 가장 대표적인 최적화 기법은 경사하강법
경사하강법: 현재 스텝의 파라미터에서 손실함수의 미분값에 러닝레이트 알파를 곱한만큼 빼서 다음 스텝의 파라미터 값으로 지정
* 텐서플로에서 변수를 선언한느 노드 tf.Variable API
https://rfriend.tistory.com/720
[TensorFlow] 값 변경이 가능한 변수 (tf.Variable)
지난번 포스팅에서는 TensorFlow 의 tf.constant() 로 텐서를 만드는 방법(https://rfriend.tistory.com/718)을 소개하였습니다. 이번 포스팅에서는 TensorFlow 의 변수 (Variable) 에 대해서 소개하겠습니다. (1) TensorFl
rfriend.tistory.com
#텐서플로 라이브러리를 임포트합니다.
import tensorflow as tf
# 선형회귀 모델(Wx + b)을 위한 tf.Variable을 선언합니다.
W = tf.Variable(tf.random.normal(shape=[1]))
b = tf.Variable(tf.random.normal(shape=[1]))
@tf.function
def create_linear_model(x):
return W*x + b
# 손실 함수를 정의합니다.
# MSE 손실함수 \mean{(y' - y)^2}
@tf.function
def create_mse_loss(y_pred, y):
return tf.reduce_mean(tf.square(y_pred - y))
# 최적화를 위한 그라디언트 디센트 옵티마이저를 정의합니다.
optimizer = tf.optimizers.SGD(0.01)
# 최적화를 위한 function을 정의합니다.
@tf.function
def train_step(x, y):
with tf.GradientTape() as tape:
y_pred = create_linear_model(x)
loss = create_mse_loss(y_pred, y)
gradients = tape.gradient(loss, [W, b])
optimizer.apply_gradients(zip(gradients, [W, b]))
# 트레이닝을 위한 입력값과 출력값을 준비합니다.
x_train = [1, 2, 3, 4]
y_train = [2, 4, 6, 8]
# 경사하강법을 1000번 수행합니다.
for i in range(1000):
train_step(x_train, y_train)
# 테스트를 위한 입력값을 준비합니다.
x_test = [3.5, 5, 5.5, 6]
# 테스트 데이터를 이용해 학습된 선형회귀 모델이 데이터의 경향성(y=2x)을 잘 학습했는지 측정합니다.
# 예상되는 참값 : [7, 10, 11, 12]
print(create_linear_model(x_test).numpy())
'AI HW study > AI - NLP' 카테고리의 다른 글
BERT(Bidirectional Encoder Representations from Transformers)에 대해 알아보자! (1) | 2024.01.23 |
---|---|
GitHub 사용법을 알아봅시다 (0) | 2024.01.22 |
PyTorch for Deep Learning & Machine Learning – Full Course (0) | 2024.01.08 |
AI공부 사이트 ( + Bert + ResNet) (0) | 2024.01.04 |
TensorFlow (and Keras) (0) | 2023.08.09 |