【问题标题】:Different results when training a model with same initial weights and same data训练具有相同初始权重和相同数据的模型时的不同结果
【发布时间】:2019-10-17 22:29:03
【问题描述】:

我正在尝试进行一些迁移学习,以将 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

什么可以使每次运行的输出不同? 由于初始权重相同,因此无法解释差异(我也尝试冻结一些层,但没有帮助)。有什么想法吗?

谢谢!

【问题讨论】:

  • 差异显着吗?预计每次运行都会有微小的差异。

标签: python computer-vision conv-neural-network


【解决方案1】:

当您在 Dense 层中随机初始化权重时,权重在运行期间的初始化方式不同,并且还会收敛到不同的局部最小值。

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

如果您希望输出相同,则需要在运行期间使用相同值初始化权重。您可以在 Keras here 上阅读有关如何获得可重现结果的详细信息。这些是您需要遵循的步骤

  1. PYTHONHASHSEED 环境变量设置为0
  2. numpy生成随机数np.random.seed(SEED)设置随机种子
  3. 为 Python 生成的随机数设置随机种子random.seed(SEED)
  4. 为 tensorflow 后端设置随机状态tf.set_random_seed(SEED)

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2022-08-05
    • 2013-03-04
    • 2016-11-23
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多