每个 运行 中每个网络结果的差异?

Difference in every result of network in every run?

我编写了一个简单的神经网络(MLP 回归器)来适应简单的数据框列。为了获得最佳架构,我还将其定义为一个函数,以查看它是否正在收敛到一个模式。但是每次我 运行 模型,它给我的结果都与我上次尝试的结果不同,我不知道为什么?由于使问题可重现相当困难,我无法 post 数据,但我可以 post 此处的网络架构:

def MLP(): #After 50
    nn=30
    nl=25
    a=2
    s=0
    learn=2
    learn_in=4.22220046e-05
    max_i=1000
    return nn,nl,a,s,learn,learn_in,max_i#,



def process(df):
    y = df.iloc[:,-1]
    X = df.drop(columns=['col3'])
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=27)
    return X_train, X_test, y_train, y_test

def MLPreg(x_train, y_train):#
    nn,nl,a,s,learn,learn_in,max_i=MLP()#nl,
    act=['identity', 'logistic', 'relu','tanh'] #'identity'=Linear
    activ=act[a]
    sol=['lbfgs', 'sgd', 'adam']
    solv=sol[s]
    l_r=['constant','invscaling','adaptive']
    lr=l_r[learn]
    model = MLPRegressor(hidden_layer_sizes=(nl,nn), activation=activ, solver=solv, alpha=0.00001, batch_size='auto', 
    learning_rate=lr, learning_rate_init=learn_in, power_t=0.5, max_iter=max_i, shuffle=True, random_state=None,
    tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False, 
    validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, n_iter_no_change=10, max_fun=15000)
    model.fit(x_train, y_train)
    return model

即使我试图保留所有使模型产生随机性的变量 Off,但我在每个 运行 中收到不同的 mse。 下面的新模型是最简单的版本。

def MLPreg(x_train, y_train):
    model = MLPRegressor(hidden_layer_sizes=(100,),
    activation='relu',
    solver='adam',
    alpha=0.0001,
    batch_size='auto',
    learning_rate='constant',
    learning_rate_init=0.001,
    power_t=0.4,
    max_iter=100,)
    model.fit(x_train, y_train)
    
    return model

第一次mse:

2.6935335013259937e-05
2.7836293087120013e-05
7.218691932722961e-05
4.950603795598673e-05
4.743424330664441e-06

第二次mse:

3.6520542498579784e-06
1.151821946860996e-05
3.0840569586230768e-06
1.4008729128558944e-05
9.326142225670172e-06

以此类推

查看 MLPRegressor 的文档,这两个参数对于可重现的结果很重要:

shuffle:bool, default=True

Whether to shuffle samples in each iteration. Only used when solver=’sgd’ or ‘adam’.

设置 shuffle=False 以在运行之间具有相同的行为。

random_state: int, RandomState instance, default=None

Determines random number generation for weights and bias initialization, train-test split if early stopping is used, and batch sampling when solver=’sgd’ or ‘adam’. Pass an int for reproducible results across multiple function calls.

按照这些说明并为此参数设置一个 int 值。您的代码示例目前都没有这样做(一个将其设置为 None,这是不可重现的默认值,另一个将其省略)。