#python #tensorflow #machine-learning #keras #deep-learning
#python #тензорный поток #машинное обучение #keras #глубокое обучение
Вопрос:
Привет, я пытаюсь провести трансфертное обучение в Keras, и я пытаюсь загрузить веса в новую модель, которую я самостоятельно обучил из другой задачи.
Я натренировал свой собственный набор весов на основе другого задания. Эта другая задача, однако, является проблемой двоичной классификации, в то время как моя новая проблема — это проблема классификации с несколькими метками.
Я получил свой первый набор весов, делая это:
n_classes = 1
epochs = 100
batch_size = 32
input_shape = (224, 224, 3)
base_model = MobileNetV2(input_shape=input_shape, weights= None, include_top=False)
x = GlobalAveragePooling2D()(base_model.output)
output = Dense(n_classes, activation='sigmoid')(x)
model = tf.keras.models.Model(inputs=[base_model.input], outputs=[output])
opt = optimizers.Adam(lr = 0.001)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
...
...
history = model.fit(train_generator, epochs=epochs,
steps_per_epoch=step_size_train,verbose=1,
validation_data=valid_generator,
validation_steps=STEP_SIZE_VALID,
class_weight=class_weights,
)
model.save_weights("initial-weights.h5")
Но когда я пытаюсь загрузить эти веса в свою новую модель:
weights_path = 'initial-weights.h5'
n_classes = 14
epochs = 1000
batch_size = 32
input_shape = (224, 224, 3)
base_model = MobileNetV2(input_shape=input_shape, weights= None, include_top=False)
x = GlobalAveragePooling2D()(base_model.output)
output = Dense(n_classes, activation='sigmoid')(x)
model = tf.keras.models.Model(inputs=[base_model.input], outputs=[output])
opt = optimizers.Adam(lr = 0.001)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
model.load_weights(weights_path)
Я получаю следующую ошибку:
ValueError: Shapes (1280, 14) and (1280, 1) are incompatible
Я понимаю, что, исходя из ошибки, это, скорее всего, связано с разницей в количестве классов, но из того, что я знаю об обучении передаче, можно переносить веса из разных задач, даже если количество классов различно (например, как веса ImageNet используются для задач, которыеимеют разное количество классов).
Как мне инициализировать свой собственный набор пользовательских весов, которые обучаются из другой задачи с другим количеством классов?
Комментарии:
1. Сначала вы устанавливаете
n_classes = 1
, а после меняете его наn_classes = 14
. Похоже на опечатку.2. @Frightera это намеренно. Вторая модель предназначена для использования для другой задачи, которая имеет 14 различных классов.
3. Я вижу, вы можете попробовать загружать веса в слои один за другим, исключая последний слой.
Ответ №1:
Я думаю, что лучшим подходом является передача весов для всех слоев, кроме последнего (т. Е. часть извлечения функций). Затем вы можете заморозить все переданные веса и снова обучить модель, где только веса на последнем уровне (т. Е. уровень классификации) будет обучен.