import tensorflow as tf
import tensorflow.keras as keras
inp = keras.Input((3, 3))
layer = keras.layers.Dense(1)
tar = layer(inp)
tar2 = layer(inp, training=False)
이렇게 두고
model2 = keras.Model(inp, tar2)
model2.compile(loss='mse', optimizer=keras.optimizers.Adam(0.01))
이렇게 compile한 다음,
a = tf.random.normal((1, 3, 3))
b = tf.random.normal((1, 3, 1))
model2.fit(a, b)
해보면 전후로 layer.trainable_variables가 변해있음...
왜?????
진짜 왜???? training=False로 두고 했는데????
나 멘붕 왔어 님들 제발 살려줘 왜 이래??? 이러면 내가 reuse한게 다 무너지는데??
제발 아무나 살려주라 안 그러면 나 stackoverflow에 또 물어보러가야돼...제발 살려줘..
텐서플로우좀 하지마라 제발 저게 토치의 train eval 모드 같은거라면 그냥 batch normalize나 dropout 기능 껐다 키는 용도임
ㅜㅜㄹㅇ이 말만 존나 듣네 tf 버리라고 아오 씨바 이번 프로젝트 끝나면 진짜 갈아타야겠다... training=False 딱 그 정도 용도로만 쓰는거 맞는듯 근데 그럼 특정 layer를 reuse할 때 freeze하는 법은 없어? pytorch로 설명해도 알아서 찾아볼게
inp1 = keras.Input((2, 3)) inp2 = keras.Input((4, 3)) layer1 = keras.layers.Dense(1) intermediate_output1 = layer1(inp1) intermediate_output2 = layer1(inp2, training=False) # 여기서 layer1을 다시 학습시키기가 싫음
.requires_grad() 였나 이거 텐서플로우 버전 있나 찾아보고 x.detach() 이것도 있나 찾아봐 requires grad는 내 기억으로 gradient는 흐르는데 업데이트에서 제외 되는거고 모듈 출력부를 detach 해버리면 아예 gradient 도 안흐름
tf.stop_gradient() 이거 써야되나보네 아 안 그래도 지금 low-level로 training loop라 충분히 복잡한데 씨이이이발
모듈 freeze 하는게 생각보다 중요하기 때문에 잘 알아두셈
아니 fine-tuning할 때는 그냥 trainable=False 박고 하면 되니깐 존나 쉬운데 내 경우에는 첫 input에 대해서는 train할건데 두 번째 input에 대해서는 train 안 하려다보니깐 지랄이 나네 아
stop_grad 쓰는게 맞긴한데 얘는 컴파일 하면 건드리질 못해서
케라스나 TF에서 Batch Normal같이 중간에 껐다 켰다 해야되는 애들은 건드리는 방법이 있긴한데
5년전꺼라서 지금도 적용되는지는 모름
https://github.com/tensorflow/tensorflow/issues/23873