![](/img/trans.png)
[英]Keras LSTM - why different results with “same” model & same weights?
[英]Different results when training a model with same initial weights and same data
我正在嘗試進行一些轉移學習,將ResNet50調整為我的數據集。 問題是當我用相同的參數再次運行訓練時,我得到了不同的結果(火車和val組的損失和准確性,所以我猜也有不同的權重,因此測試集的錯誤率不同)這里是我的模型:
權重參數是'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
什么可以使每次運行的輸出不同? 由於初始權重是相同的,它無法解釋差異(我也試圖凍結一些層,沒有幫助)。 有任何想法嗎?
謝謝!
在Dense圖層中隨機初始化權重時,權重會在不同的運行中進行不同的初始化,並且會收斂到不同的局部最小值。
x = Dense(num_classes, activation='relu')(x) # new FC layer, random init
如果希望輸出相同,則需要在運行期間初始化具有相同值的權重。 您可以在此處閱讀有關如何在Keras上獲得可重現結果的詳細信息。 這些是您需要遵循的步驟
PYTHONHASHSEED
環境變量設置為0
numpy
生成的隨機數設置隨機種子np.random.seed(SEED)
random.seed(SEED)
tf.set_random_seed(SEED)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.