【问题标题】:Even setting random seed sequential model in keras returns differnt results即使在 keras 中设置随机种子序列模型也会返回不同的结果
【发布时间】:2018-01-04 21:48:40
【问题描述】:

谁能帮我理解为什么这个模型不能给出可重复的结果?每次我运行它时,它都会更改我正在使用的测试集和其他验证集的准确度值。我正在使用定义的种子。我不明白为什么会这样。

以下是我的部分代码:

np.random.seed(7)

# Create the model
def create_model(neurons=190, init_mode='normal', activation='relu', inputDim=8040, dropout_rate=0.8,
                 learn_rate=0.001, momentum=0.7, weight_constraint=5): 
    model = Sequential()
    model.add(Dense(neurons, input_dim=inputDim, kernel_initializer=init_mode, activation=activation, kernel_constraint=maxnorm(weight_constraint), kernel_regularizer=regularizers.l2(0.002)))
    model.add(Dense(1, activation='sigmoid'))
    optimizer = RMSprop(lr=learn_rate)

    # compile model

    model.compile(loss='binary_crossentropy', optimizer='RmSprop', metrics=['accuracy'])

model = create_model()

seed = 7
# Define k-fold cross validation test harness

kfold = StratifiedKFold(n_splits=3, shuffle=True, random_state=seed)
cvscores = []
for train, test in kfold.split(X_train, Y_train):
    print("TRAIN:", train, "VALIDATION:", test)


# Fit the model

history = model.fit(X_train, Y_train, epochs=40, batch_size=50, validation_data=(X_test, Y_test), verbose=0)

我会很感激它上面的一些 cmets。

【问题讨论】:

    标签: machine-learning keras keras-layer random-seed


    【解决方案1】:

    您的随机种子正在修复您的交叉验证拆分,而不是模型权重初始化,您在设置关键字“init_mode=normal”时在create_model 中指定。

    您可以在调用 create_model 之前尝试设置 RNG 种子,但根据 keras 生成随机数的方式,您可能需要使用 custom initializer 以获得一致的结果。

    种子配置取决于其他几个因素,包括您使用的 keras 后端(Theano 与 TensorFlow)以及您使用的 python 版本。更多详情请参阅this github issue

    【讨论】:

    • 我没有明白设置 RNG 种子是什么意思。顺便说一句random_state不是创建模型的函数或属性,所以我不知道如何在那里设置种子。使用该自定义初始化程序,是否意味着我必须排除我的 init_mode='normal' 以及您向我发送链接的 keras 文档提出的那个?
    • 我试过这个:from keras import backend as K def my_init(shape, dtype=None): return K.random_normal(shape, dtype=dtype, seed=7) def create_model(neurons=190, init_mode='normal', activation='relu', inputDim=8040, dropout_rate=0.8, learn_rate=0.001, momentum=0.7, weight_constraint=5): model = Sequential() model.add(Dense(neurons, input_dim=inputDim, kernel_initializer=my_init, activation=activation, kernel_constraint=maxnorm(weight_constraint), kernel_regularizer=regularizers.l2(0.002))) 但仍然返回不同的结果。
    • 我的意思是,我们甚至在您设置随机种子之前就已经绘制了随机数。有关更多详细信息,请参阅我的答案的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多