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

标签 tensorflow machine-learning keras

我使用 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 Notebook 中运行代码时,代码工作得很好,准确率达到 90%。但当我重新运行它时,它的准确率急剧下降到 50%,并且在训练过程中准确率没有提高。另外,如果我在同一个笔记本页面中构造另一个像这样的神经网络,它也会有这个问题。

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

PS:我使用的是tensorflow后端。

最佳答案

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

<小时/>

上一个答案:

神经网络学习具有随机结果,因为

  1. 随机权重初始化
  2. SGD 算法(例如 Adam)中的随机批量拆分/排序

例如这段代码

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. 如果数据/模型存在一些问题(如在这个 mnist 示例中数据太小且模型太简单),代码可能会产生非常不同的结果。 90% 可能只是过度拟合。检查另一个独立测试数据上的分类器。

关于tensorflow - 如何在jupyter笔记本中多次拟合/运行神经网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54050656/

相关文章:

tensorflow - keras.layers.Conv2D 的默认内核大小、零填充和步幅是多少?

python - 存储 session 时 tensorflow 中出现错误 "no Variable to save"

python - 如何分析 Python 脚本的 CPU 使用率?

scikit-learn - GridSearchCV 最佳模型 CV 历史

tensorflow - Layer.add_loss() 的目的和直觉是什么?它是如何工作的?它是否只计算当前层的损失?

python - 预训练模型的层输出意外地产生不同的输出

python - tf.learn 估计器的分布式训练?

python - 由于 tf.keras.preprocessing.text.Tokenizer.texts_to_sequences 上的 np.hstack 导致尺寸(形状)发生变化

machine-learning - 一级分类器训练

algorithm - 我想运行一个具有指定假设的监督学习算法,该假设的参数 theta 处于异常位置