모든 머신 러닝의 기초가 되는 저수준 텐서 연산은 텐서플로 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 는 각각 += -= 와 같다
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)