Общий подход состоит в том, чтобы брать только нижние слои предварительно обученного CNN (например, Re sNet) и добавлять новые слои поверх существующего CNN.
После того, как у вас есть модель, вам, вероятно, следует заблокировать предварительно подготовленные слои в начале тренировки, чтобы не разрушать уже обученные веса, а затем после нескольких циклов, когда уклон стабилизируется, вы можете разблокировать их. слоев и продолжить обучение.
Самый простой способ отбросить верхние слои предварительно обученной сети - установить для аргумента include_top
значение False
.
base_model = ResNet50(include_top=False, weights="imagenet")
Затем вы можете начать добавлять свои слои как обычно, т.е. (n_classes
относится к числу классов, которые вы хотите классифицировать)
my_hidden1 = keras.layers.Dense(128, activation="relu")(base_model)
# rest of the custom layers
...
output = keras.layers.Dense(n_classes, activation="softmax")(previous_layer)
model = keras.Model(inputs=base_model.input, outputs=output)
Чтобы заблокировать предварительно подготовленные слои в начале
for layer in base_model.layers:
layer.trainable = False
Тогда вы можете compile
и fit
ваша новая модель на несколько эпох (даже с большей скоростью обучения), т.е.
optimizer = keras.optimizers.SGD(lr=0.2, momentum=0.9, decay=0.01)
model.compile(optimizer=optimizer, ...)
model.fit(...)
После того, как начальное обучение завершено, вы можете разблокировать базовые слои и продолжить обучение (обычно вы хотите уменьшить скорость обучения на этом этапе).
for layer in base_model.layers:
layer.trainable = True
optimizer = keras.optimizers.SGD(lr=0.01, momentum=0.9, decay=0.001)
model.compile(...)
model.fit(...)
Обратите внимание, что вам придется запускать compile
каждый раз, когда вы блокируете или разблокируете эти слои. * 1 026 *