Различные результаты при обучении модели с одинаковыми начальными весами и одинаковыми данными - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь научиться настраивать ResNet50 для моего набора данных.проблема в том, что когда я снова запускаю тренировку с теми же параметрами, я получаю другой результат (потери и точность для наборов поездов и валов, поэтому я предполагаю также разные веса и, как результат, разную частоту ошибок для тестового набора), вот моймодель:

весовой параметр 'imagenet', все остальные значения параметров не очень важны, важно то, что они одинаковы для каждого прогона ...

def ImageNet_model(train_data, train_labels, param_dict, num_classes):
    X_datagen = get_train_augmented()
    validatin_cut_point= math.ceil(len(train_data)*(1-param_dict["validation_split"]))
    base_model = applications.resnet50.ResNet50(weights=param_dict["weights"], include_top=False, pooling=param_dict["pooling"],
                                                   input_shape=(param_dict["image_size"], param_dict["image_size"],3))  
    # Define the layers in the new classification prediction
    x = base_model.output
    x = Dense(num_classes, activation='relu')(x)  # new FC layer, random init
    predictions = Dense(num_classes, activation='softmax')(x)  # new softmax layer

    model = Model(inputs=base_model.input, outputs=predictions)
    #   Freeze layers
    layers_to_freeze = param_dict["freeze"]
    for layer in model.layers[:layers_to_freeze]:
       layer.trainable = False
    for layer in model.layers[layers_to_freeze:]:
       layer.trainable = True
    sgd = optimizers.SGD(lr=param_dict["lr"], momentum=param_dict["momentum"], decay=param_dict["decay"])
    model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])
    lables_ints = [y.argmax() for y in np.array(train_labels)]
    class_weights = class_weight.compute_class_weight('balanced',
                                             np.unique(lables_ints),
                                             np.array(lables_ints))
    train_generator = X_datagen.flow(np.array(train_data)[0:validatin_cut_point],np.array(train_labels)[0:validatin_cut_point], batch_size=param_dict['batch_size'])
    validation_generator = X_datagen.flow(np.array(train_data)[validatin_cut_point:len(train_data)],
                                   np.array(train_labels)[validatin_cut_point:len(train_data)],
                                   batch_size=param_dict['batch_size'])
    history= model.fit_generator(
    train_generator,
    epochs=param_dict['epochs'],
    steps_per_epoch=validatin_cut_point // param_dict['batch_size'],
    validation_data=validation_generator,
    validation_steps=(len(train_data)-validatin_cut_point) // param_dict['batch_size'],
    class_weight=class_weights)
    shuffle=False,class_weight=class_weights)
    graph_of_loss_and_acc(history)
    model.save(param_dict['model_file_name'])
    return model

чтоможет сделать вывод каждого прогона разным?Поскольку начальные веса одинаковы, это не может объяснить разницу (я также пытался заморозить некоторые слои, но это не помогло).есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 01 июня 2019

Когда вы случайным образом инициализируете весовые коэффициенты в плотном слое, весовые коэффициенты инициализируются по-разному для разных прогонов и также сходятся к различным локальным минимумам.

x = Dense(num_classes, activation='relu')(x)  # new FC layer, random init

Если вы хотите, чтобы выходные данные были одинаковыми, вам нужно инициализировать веса с одинаковыми значениями для всех прогонов.Вы можете прочитать подробности о том, как получить воспроизводимые результаты на Keras здесь .Вот шаги, которые необходимо выполнить

  1. Установите переменную среды PYTHONHASHSEED равной 0
  2. Установите случайное начальное число для numpy сгенерированных случайных чисел np.random.seed(SEED)
  3. Установить случайное начальное число для генерируемых Python случайных чисел random.seed(SEED)
  4. Установить случайное состояние для бэкэнда тензорного потока tf.set_random_seed(SEED)
...