[tensorflow](2) 딥러닝의 원리

haden·2022년 2월 4일
0
post-custom-banner

tensor 는 자료형이다

그냥 tensorflow 에서 숫자, 리스트 담는 곳임

딥러닝과 tensorflow 가 뭔 상관?

행렬로 인풋 / w 값 저장 가능함 -> Node 값 계산이 쉽다


새로운 노드 만드는 식 : x1 w1 + x2 w2 + x3 * w3
행렬을 사용해 계산하면 숫자 여러개를 한꺼번에 계산 가능함

텐서로 행렬 표현하기

행렬로 연산하기

행렬의 곱셈을 하고 싶을 땐 tf.matmul() but 3차원 이상만 가능함!

tf.zeros([2,2,3])

뒤에서부터 해석
2개의 행, 3개의 열인 행렬을 두개 만들어주세요
0으로 가득 찬 tensor 만들때 사용하는 메서드

차원 지정이 가능함

tensor.shape

몇 차원의 행렬인지 알고 싶을 때
(2,2) -> 2개의 자료가 있는 리스트가 두개 있다
(2,3) -> 3개의 자료가 있는 리스트가 두개 있다

텐서플로우에 대한 간단한 아웃라인

y = ax + b
모르는 직선을 추정하는 식
a 와 b의 값을 찾는 게 목표

키 = 170
신발 = 260

신발 = 키*a + b

연관은 있을 것 같은데 어떤 식으로 연관이 있는 줄 모르기때문에 위와 같이 식을 세우는 것

tf.Variable()

텐서 플로우로 가중치 만드는 문법

a = tf.Variable(0.1) ##괄호 안은 초기값
b = tf.Variable(0.2)

좋은 결과가 나올때까지 변수를 학습시켜보려고함

경사하강법 이용

tf.keras.optimizers, opt.minimize

경사하강법 이용해서 가중치 자동 업데이트 해주는 고마운 도구

opt = tf.keras.optimizers.Adam(learning_rate=0.1)
opt.minimize(손실함수, var_list=[a,b])

learning_rate : 얼마만큼 한번에 w 변수들을 업데이트 할지 숫자 지정
러닝레이트의 조절에 따라 값이 달라지므로 결과가 잘 나오도록이 값을 잘 찾아주는 것도 매우 중요함
var_list=[a,b] : 여기서 a,b 는 경사하강법으로 업데이트할 weight variable 목록

tf.square()

손실함수 만드는 메서드 중 하나
여기서 손실값 = 실제값 - 예측값, 즉 오차
square은 제곱해주는 도구임

def 손실함수():
  return tf.square(실제값-예측값)

opt.minimize()

최적값 나올때까지 opt.minimize 여러번 반복한다

opt = tf.keras.optimizers.Adam(learning_rate=0.1)
for i in range(300):
  opt.minimize(손실함수, var_list=[a,b])
  print(a.numpy(),b.numpy())

결과

실행할수록 값이 1.519... / 1.619...에 가까워짐


이건 포문 초기값

이건 후기값

구한 가중치를 만들어둔 예측함수에 대입해서 결과를 확인함

실제값과 굉장히 유사함을 확인

데이터가 리스트로 주어진 경우에는 어떻게 할까 ?

일단 무조건 예측모델부터 만들어

예측_y = train_x*a + b

tf.keras.losses.mse(train_y, 예측_y)

손실함수 mean squared error 평균 제곱 오차 구하는 메소드

# 데이터가 리스트로 주어진 경우

train_x = [1,2,3,4,5,6,7]
train_y = [3,5,7,9,11,13,15]


a = tf.Variable(0.1)
b = tf.Variable(0.1)


def 손실함수():
  예측_y = train_x*a + b
  return tf.keras.losses.mse(train_y, 예측_y)


opt = tf.keras.optimizers.Adam(learning_rate=0.1)

for i in range(300):
  opt.minimize(손실함수(train_x[i], train_y[i]), var_list=[a, b])
  print(a.numpy(), b.numpy())

적당한 결과가 나올때까지 range 값을 조정하자

근데 이건 딥러닝이 아님

딥러닝은 뉴럴네트워크를 타고 생각의 과정을 거쳐서 결과를 도출해야함
딥러닝을 만ㄷ르고 싶으면 히든 레이어가 꼭 필요함
노드끼리도 연산을 해서 최종 예측값을 낸다

profile
hi i'm haden
post-custom-banner

0개의 댓글