Sequential API
Functional API
keras.Model
을 사용해서 모델을 만든다는 것이 특징이다. keras.Model
클래스를 상속받아서 쓰는 것이다.Subclassing
keras.Model
은 __init__()
이라는 메서드 안에서 레이어 구성을 정의call()
메소드에서 forward propagation
을 구현call()
을 쓰지도 않았는데 어떻게 모델의 forward propagation이 만들어지는 걸까?https://stackoverflow.com/questions/59473267/why-in-keras-subclassing-api-the-call-method-is-never-called-and-as-an-alternat
결론적으로Model
이라는 class를 상속한 나의 customised model은 알고보니Model
내부에__call__
이라는 것이 있고, 그것이 자동으로 호출되는 거란다.(그리고 난def call(self, input):
을 통해 그 부분을 override 해준 거란다.
tf.GradientTape()
tf.GradientTape().gradients(loss, model.trainable_variables)
를 통해 자동 미분된 gradient를 가질 수 있는데,loss
는 tf.keras.losses.SparseCategoricalCrossentropy()
같은 거로 정의된 함수의 손실함수값이다.optimizer.apply_gradients(zip(gradients, model.trainable_variables))
를 통해 gradient 값을 업데이트 시킨다.fit()
라는 건 결국 tf.GradientTape()
를 활용해서 gradient를 업데이트해주는 거로 보면 되는 것 같다...
fit()
을 handmade로 만드는 게 되는 것 같다.@tf.function
은 왜 있는 건가?
성능을 높이고 이식성이 좋은 모델을 만들려면 tf.function을 사용해 그래프로 변환하세요. 하지만 조심해야 할 점이 있습니다. tf.function은 무조건 속도를 높여주는 마법의 은총알이 아닙니다!
numpy에서 ...
의 의미
from numpy import arange a = arange(16).reshape(2,2,2,2) a[..., 0].flatten() >>> array([ 0, 2, 4, 6, 8, 10, 12, 14]) 그리고 저건 a[:,:,:,0].flatten()과 같다.
np.arange(16).reshape(4,2,2)[:,np.newaxis,...].shape >>(4, 1, 2, 2)
모델을 구성만 하고 model.summary()
하면 오류가 난다.
fit()
이나 build()
를 해야 구성이된단다.