为什么每次运行程序都会得到不同的精度

问题描述 投票:0回答:1

我在 python 中使用 keras tensorflow 训练模型。 另外,正如您在下面的代码中看到的,我使用了种子参数,但是每次我使用相同的数据运行相同的代码时,我都会面临不同的准确率。

我的代码:

#Seed
tf.random.set_seed(42)
np.random.seed(42)
set_random_seed(42)
random.seed(42)

data = ('data.csv')

data = pd.get_dummies(data, columns=['cp', 'restecg'], drop_first=True)

X = data.drop('num', axis=1)
y = data['num']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

def create_model(optimizer='adam', init='glorot_uniform', neurons=[16, 8], dropout_rate=0.3):
    model = Sequential()
    model.add(Input(shape=(X_train.shape[1],)))
    model.add(Dense(neurons[0], activation='relu', kernel_initializer=init))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(neurons[1], activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])
    return model

param_grid = {
    'optimizer': ['adam', 'rmsprop'],
    'model__neurons': [[16, 8]],
    'model__init': ['glorot_uniform', 'normal'],
    'model__dropout_rate': [0.3],
    'epochs': [50], 
    'batch_size': [10],
}

model = KerasClassifier(model=create_model, verbose=0)

kfold = KFold(n_splits=3, shuffle=True, random_state=42)
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=kfold, n_jobs=-1)
grid_search_result = grid_search.fit(X_train, y_train)

print(f"Best Parameters: {grid_search_result.best_params_}")
print(f"Best Accuracy: {grid_search_result.best_score_}")

best_model = grid_search_result.best_estimator_

keras_model = best_model.model
keras_model.trainable = False 

y_pred_prob = best_model.predict(X_test).flatten()
y_pred = np.where(y_pred_prob > 0.5, 1, 0)

accuracy = accuracy_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_prob)

print(f'Accuracy (manual calculation): {accuracy:.2f}')
print(f'ROC AUC: {roc_auc:.2f}')

我每次都需要获得相同的准确性。 我该如何解决这个问题?

python tensorflow machine-learning keras deep-learning
1个回答
0
投票

如果您使用 GPU 进行训练,某些计算可能对它们是不确定的。这通常只会导致最终分数的差异非常小,所以如果您只看到一些“噪音”,那么这可能是一个问题。

您可以使用以下方法强制 TF 尽可能具有确定性: tf.config.experimental.enable_op_determinism() 这可能会让你的训练速度变慢一些,但希望更具确定性。

您还可以使用 CPU 尝试一些非常短的训练(如果您正确地播种了所有内容,那么这应该是完全确定性的),只是为了检查您的播种是否正确。

© www.soinside.com 2019 - 2024. All rights reserved.