#python #tensorflow #keras #deep-learning #model
#python #тензорный поток #keras #глубокое обучение #Модель
Вопрос:
Я использую model.fit()
несколько раз, каждый раз отвечает за подготовку блока слоев, в котором другие слои заморожены
код
# create the base pre-trained model
base_model = efn.EfficientNetB0(input_tensor=input_tensor,weights='imagenet', include_top=False)
# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# add a fully-connected layer
x = Dense(x.shape[1], activation='relu',name='first_dense')(x)
x=Dropout(0.5)(x)
x = Dense(x.shape[1], activation='relu',name='output')(x)
x=Dropout(0.5)(x)
no_classes=10
predictions = Dense(no_classes, activation='softmax')(x)
# this is the model we will train
model = Model(inputs=base_model.input, outputs=predictions)
# first: train only the top layers (which were randomly initialized)
# i.e. freeze all convolutional layers
for layer in base_model.layers:
layer.trainable = False
#FIRST COMPILE
model.compile(optimizer='Adam', loss=loss_function,
metrics=['accuracy'])
#FIRST FIT
model.fit(features[train], labels[train],
batch_size=batch_size,
epochs=top_epoch,
verbose=verbosity,
validation_split=validation_split)
# Generate generalization metrics
scores = model.evaluate(features[test], labels[test], verbose=1)
print(scores)
#Let all layers be trainable
for layer in model.layers:
layer.trainable = True
from tensorflow.keras.optimizers import SGD
#FIRST COMPILE
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss=loss_function,
metrics=['accuracy'])
#SECOND FIT
model.fit(features[train], labels[train],
batch_size=batch_size,
epochs=no_epochs,
verbose=verbosity,
validation_split=validation_split)
Что странно, так это то, что во второй подгонке точность, полученная в результате первой эпохи, намного ниже, чем точность последней эпохи первой подгонки.
Результат
Эпоха 40/40 6286/6286 [==============================] — 14 секунд 2 мс / выборка — потеря: 0,2370 — точность: 0,9211 — val_loss: 1,3579 — val_accuracy: 0,6762 874/874 [==============================] — 2 с 2 мс/выборка — потеря: 0,4122 — точность: 0,8764
Тренируйтесь на 6286 образцах, проверяйте на 1572 образцах эпохи 1/40 6286/6286 [==============================] — 60 с 9 мс/выборка — потеря: 5,9343 — точность: 0,5655 — val_loss:2.4981 — val_accuracy: 0.5115
Я думаю, что веса второй подгонки не берутся из первой подгонки
Заранее спасибо!!!
Комментарии:
1. Хм, насколько мне известно, model.compile не должен изменять веса, попробуйте не компилировать второй раз, а затем просто сделайте model. подгонка во второй раз на всякий случай. Посмотрите, работает ли это
2. Если вы действительно хотите использовать другой оптимизатор, вам нужно скомпилировать so в конце первой подходящей модели запуска, save_weights . Затем скомпилируйте. После компиляции запустите model.load_weights, затем выполните вторую подгонку.
Ответ №1:
Я думаю, что это результат использования другого оптимизатора. Вы использовали Adam в первой подгонке и SGD во второй подгонке. Попробуйте использовать Adam во второй подгонке и посмотрите, правильно ли она работает
Комментарии:
1. Нет, это не так :
Ответ №2:
Я решил это, удалив второй компилятор.