подгонка модели несколько раз в keras

#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:

Я решил это, удалив второй компилятор.