3장 : 케라스와 텐서플로 소개

텐서플로 시작하기

모든 머신 러닝의 기초가 되는 저수준 텐서 연산은 텐서플로 API로 변환된다

고수준 딥러닝 개념은 케라스 API로 변환된다

상수 텐서와 변수

텐서를 만들려면 초깃값이 필요하다

x = tf.ones(shape=(2,1)) # 2*1 크기의 행렬을 1로 초기화
x = tf.zeros(shape=(2,1)) # 2*1 크기의 행렬을 0으로 초기화
x = tf.random.normal(shape=(3,1), mean=0., stddev=1.) # 3*1 행렬을 정규 분포에서 랜덤하게 뽑아 초기화
x = tf.random.uniform(shape=(3,1), mean=0., stddev=1.) # 3*1 행렬을 균등 분포에서 랜덤하게 뽑아 초기화

❗ 텐서플로 텐서에는 값을 할당할 수 없다

넘파이 배열의 큰 차이점

텐서플로 텐서는 상수

텐서에 값을 할당하려면 변수를 사용해야 한다

텐서에 값 할당하기

v = tf.Variable(initial_value=tf.random.normal(shape=(3,1)))
v.assign(tf.ones((3,1))) # 다 1로 고쳐짐
v[0,0].assign(3.) # v[0,0] 값이 3, 나머지는 1
v.assign_add(tf.ones((3,1))) # 모든 값에 1이 더해진다
#assign_add, assign_sub 는 각각 += -= 와 같다

GradientTape

input_var = tf.Variable(initial_value=3.)
with tf.GradientTape() as tape:
   result = tf.square(input_var)
gradient = tape.gradient(result, input_var)

상수 입력 텐서와 함께 사용하려면 tape.watch(상수) 필요

input_const = tf.constant(3.)
with tf.GradientTape() as tape:
   tape.watch(input_const)
   result = tf.square(input_const)
gradient = tape.gradient(result, input_const)

gradient 안에 gradient도 계산 가능

time = tf.Variable(0.)
with tf.GradientTape() as outer_tape:
    with tf.GradientTape() as inner_tape:
        position =  4.9 * time ** 2
    speed = inner_tape.gradient(position, time)
acceleration = outer_tape.gradient(speed, time)