Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我在训练我的模型时会有如此不一致的结果?_Python_Neural Network_Keras_Deep Learning - Fatal编程技术网

Python 为什么我在训练我的模型时会有如此不一致的结果?

Python 为什么我在训练我的模型时会有如此不一致的结果?,python,neural-network,keras,deep-learning,Python,Neural Network,Keras,Deep Learning,我正在使用Keras来训练我的模型 我已经初始化了numpy和tensorflow种子。我已经做了50次迭代循环,在相同的训练、验证和测试集上训练和测试我的Keras深度学习体系结构(始终相同)。我得到了这些结果: print (np.mean(train_accuracy_vec)) print (np.std(train_accuracy_vec)) print () print (np.mean(valid_accuracy_vec)) print (np.std(valid_accura

我正在使用Keras来训练我的模型

我已经初始化了
numpy
tensorflow
种子。我已经做了50次迭代循环,在相同的训练、验证和测试集上训练和测试我的Keras深度学习体系结构(始终相同)。我得到了这些结果:

print (np.mean(train_accuracy_vec))
print (np.std(train_accuracy_vec))
print ()
print (np.mean(valid_accuracy_vec))
print (np.std(valid_accuracy_vec))
print ()
print (np.mean(test_accuracy_vec))
print (np.std(test_accuracy_vec))
print ()
我明白了:

有时,它给出了一个不可接受的假阳性率,而有时,它工作得相当好。基于
val\u acc
行为,我使用了
earlystoping

那么,是什么导致了如此巨大的不稳定呢

验证分数远低于测试分数不是有点奇怪吗

谢谢

编辑:尽管@Thomas Pinetz给出了很好的回答,但第二次我并没有得到更好的结果:仍然很高

更准确地说,以下是我的循环是如何形成的:

# tf, random and numpy seeds...
# lots of data reading, preprocessing,...(including split between train, valid and test sets) 
for k in range (0,50) :
    print (k)
    model = Sequential()
    model.add(Dense(200, activation='elu', input_dim=trainX.shape[1], init=keras.initializers.glorot_uniform(1)))
    model.add(Dropout(0.3))
    # some additional layers...
    model.compile(loss='binary_crossentropy',metrics=['accuracy'], optimizer='adam')
    model.fit(trainX, trainY, validation_data=(validX, validY), epochs=100, verbose=0 , callbacks=callbacks_list)  

    train_score = model.evaluate(trainX, trainY)
    train_accuracy_vec.append (train_score[1])
    print(train_score)
    trainPredict = model.predict(trainX)
    print(confusion_matrix(trainY, trainPredict.round()))

    # and the same for valid and test...

要在KERA中获得可复制的结果,请遵循以下说明:

可能是多线程导致了问题

编辑:

每次运行返回随机数的方法时,该数取决于初始种子。因此,尽管脚本总是返回相同的值,例如,用于训练/val/测试集评估的相同平均值和标准值,但它不会在for循环的每次迭代中使用相同的随机数

您可以尝试在整个脚本中循环,并在for循环的开头设置随机集。也许你会得到同样的结果


在生成和训练DL模型时存在各种各样的随机性。从权重的初始化到训练集的顺序(默认情况下是随机的)。如果不重置随机种子,则此初始化将不同。数据集的顺序相同。在每个历元中,您的训练数据都会被洗牌,这在每个for循环中都会有所不同。还有一些层使用随机元素,比如dropout,它们需要相同的种子来保证相同的性能

要在KERA中获得可复制的结果,请遵循以下说明:

可能是多线程导致了问题

编辑:

每次运行返回随机数的方法时,该数取决于初始种子。因此,尽管脚本总是返回相同的值,例如,用于训练/val/测试集评估的相同平均值和标准值,但它不会在for循环的每次迭代中使用相同的随机数

您可以尝试在整个脚本中循环,并在for循环的开头设置随机集。也许你会得到同样的结果


在生成和训练DL模型时存在各种各样的随机性。从权重的初始化到训练集的顺序(默认情况下是随机的)。如果不重置随机种子,则此初始化将不同。数据集的顺序相同。在每个历元中,您的训练数据都会被洗牌,这在每个for循环中都会有所不同。还有一些层使用随机元素,比如dropout,它们需要相同的种子来保证相同的性能

导致运行之间差异的原因是权重的随机初始化。基于梯度下降的方法陷入局部极小,因此,每次运行时找到的最佳解决方案取决于初始权重。对此你无能为力。这是神经网络固有的问题。不过,看看Xavier/He的初始化可能会有所帮助


至于为什么验证错误比测试错误更糟糕,这确实很奇怪。但是,如果您的数据集相对较小,并且您在所有运行中都使用相同的拆分,那么可能恰好测试集与训练集具有相似的模式,而验证具有不同的模式。您最好在每次跑步时进行分割。

导致跑步之间差异的原因是随机初始化权重。基于梯度下降的方法陷入局部极小,因此,每次运行时找到的最佳解决方案取决于初始权重。对此你无能为力。这是神经网络固有的问题。不过,看看Xavier/He的初始化可能会有所帮助


至于为什么验证错误比测试错误更糟糕,这确实很奇怪。但是,如果您的数据集相对较小,并且您在所有运行中都使用相同的拆分,那么可能恰好测试集与训练集具有相似的模式,而验证具有不同的模式。您最好在每次运行时进行拆分。

您的测试、验证和训练集是否都来自同一分布?@marco_gorelli它们应该来自同一数据集,并且是随机选择的。。。但无论如何,我不明白为什么集合之间的不同分布会导致不一致的结果,因为我的集合在一次迭代到另一次迭代中保持完全相同……您的测试、验证和训练集合是否都来自相同的分布?@marco_gorelli它们应该来自相同的数据集,并且是随机选择的。。。但无论如何,我不明白为什么集合之间的不同分布会导致不一致的结果,因为我的集合在一次迭代到另一次迭代中保持完全相同……数据集不是很小:)。但是谢谢你,泽维尔/他。你的回答似乎是对“托马斯·皮涅茨”的补充,我应该在凯拉斯身上选择哪一个?我看了这篇文章:但似乎我有“选择权”…@MysteryGuy:在你的链接中,
glorot\u normal
似乎是xavier初始化。另一方面,如果您使用
zero()
Ones()
您的结果应该是可复制的(我没有使用keras,但它是有意义的),我测试了这两个(互补的)AN,但仍然肯定会得到不好的结果(标准偏差约为0.03,相当高…)数据集不是很小:)。但是谢谢你,泽维尔/他。你的回答似乎是对“托马斯·皮涅茨”的补充,我应该在凯拉斯身上选择哪一个?我看了这张报纸: