Open givitallugot opened 1 year ago
8개의 클래스만 담겨있는 패션 MNIST 데이터셋에서
모델 A를 로드하여 이 모델의 층을 기반으로 새로운 모델을 만듦 (출력층 제외 모든 층을 재사용)
model_A = keras.models.load_model("my_model_A.h5")
model_B_on_A = keras.models.Sequential(model_A.layers[:-1])
model_B_on_A.add(keras.layers.Dense(1, activation="sigmoid"))
model_A와 model_B_on_A는 일부 층을 공유하므로, model_B_on_A를 훈련할 때 model_A도 영향을 받음
작업 B를 위해 model_B_on_A를 훈련
for layer in model_B_on_A.layers[:-1]:
layer.trainable = False
model_B_on_A.compile(loss="binary_crossentropy", optimizer="sgd", metrics=["accuracy"])
history = model_B_on_A.fit(X_train_B, y_train_B, epochs=4, validation_data=(X_valid_B, y_valid_B))
for layer in model_B_on_A.layers[:-1]:
layer.trainable = True
optimizer = keras.optimizers.SGD(lr=1e-4) # 기본 학습률은 1e-2
model_B_on_A.compile(loss="binary_crossentropy", optimizer=optimizer, metrics=["accuracy"])
history = model_B_on_A.fit(X_train_B, y_train_B, epochs=16, validation_data=(X_valid_B, y_valid_B))
# 그레이디언트 벡터의 모든 원소를 -1에서 1 사이로 클리핑
# --> 손실의 모든 편미분값을 -1에서 1 사이로 잘라냄
optimizer = keras.optimizers.SGD(clipvalue=1.0)
model.compile(loss="mse", optimizer=optimizer)
clipvalue
대신 clipnorm
을 지정해서 노름으로 클리핑
-ex. 벡터 [0.9, 100.0 ] - clipvalue [0.9, 1.0] / clipnorm [0.00899964, 0.9999595]
2023/01/20 (금) pm 10:30 이후