如何在jupyter笔记本中多次拟合/运行神经网络



我正在使用keras构建一个简单的神经网络,如下所示:

import keras
from keras.models import Sequential
from keras.layers import Dense
classifier = Sequential()
classifier.add(Dense(10, kernel_initializer='uniform', activation= 'relu', input_dim = 2))
...
classifier.compile(optimizer= 'adam',loss='binary_crossentropy', metrics=['accuracy'])
classifier.fit(X_train,y_train,batch_size=10,epochs=100)

当我第一次在jupyter笔记本上运行它时,代码运行得非常好,并获得了90%的准确率。但当我重新运行它时,它的准确率急剧下降到50%,而且在训练过程中准确率没有提高。此外,如果我在同一个笔记本页面中构建另一个类似的NN,它也会出现这个问题。

那么,如果我想在重新运行代码或在同一笔记本页面中运行另一个NN时得到正确的结果,该怎么办?

PS:我正在使用tensorflow后端。

编辑:结果不同主要是因为权重初始化和批次。但种子固定不足以实现完全的再现性,请参阅:

  • https://keras.io/getting-started/faq/#how-can-i-obtain-reproductible-results-using-keras-during development
  • 为什么可以';即使我设置了随机种子,我在Keras中也能得到可重复的结果吗

以前的答案:

由于,神经网络学习具有随机结果

  1. 随机权重初始化
  2. Adam等SGD算法中的随机批处理拆分/排序

例如,此代码为

import numpy as np
import keras 
from keras.models import Sequential
from keras.layers import Dense, Flatten
def run():
classifier = Sequential()
classifier.add(Flatten(input_shape=(28, 28)))
classifier.add(Dense(10, kernel_initializer='uniform', activation= 'relu'))
classifier.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
X_train, y_train = keras.datasets.mnist.load_data()[0]
X_train = X_train[:100] # for example
y_train = keras.utils.to_categorical(y_train)[:100]
classifier.fit(X_train, y_train, batch_size=10, epochs=100)

每次运行都会得到不同的结果。

>>> run()
Epoch 1/100
100/100 [==============================] - 0s 4ms/step - loss: 10.1763 - acc: 0.1700
...
Epoch 100/100
100/100 [==============================] - 0s 2ms/step - loss: 4.5131 - acc: 0.4700
>>> run()
Epoch 1/100
100/100 [==============================] - 0s 5ms/step - loss: 7.2993 - acc: 0.2000
...
Epoch 1/100
100/100 [==============================] - 0s 2ms/step - loss: 0.8059 - acc: 0.7000

您可以在keras随机生成器(它是numpy)中固定种子以获得再现性。

>>> np.random.seed(1)
>>> run()
Epoch 1/100
100/100 [==============================] - 0s 5ms/step - loss: 7.6193 - acc: 0.1500
...
Epoch 100/100
100/100 [==============================] - 0s 2ms/step - loss: 0.3224 - acc: 0.6400
>>> np.random.seed(1)
>>> run()
Epoch 1/100
100/100 [==============================] - 0s 5ms/step - loss: 7.6193 - acc: 0.1500
...
Epoch 100/100
100/100 [==============================] - 0s 2ms/step - loss: 0.3224 - acc: 0.6400

https://github.com/keras-team/keras/issues/2743#issuecomment-219777627

p.S.如果数据/模型存在一些问题(如本例中数据太小,模型太简单),代码可能会产生非常不同的结果。90%可能只是过度拟合。在另一个独立的测试数据上检查分类器。

最新更新