【问题标题】:How to fit/run the neural network multiple times in jupyter notebook?如何在 jupyter notebook 中多次拟合/运行神经网络?
【发布时间】:2019-01-05 09:22:56
【问题描述】:

我正在使用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%,并且在训练过程中准确率并没有提高。另外,如果我在同一个笔记本页面中构建另一个这样的 NN,它也有这个问题。

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

PS:我正在使用 tensorflow 后端。

【问题讨论】:

    标签: tensorflow machine-learning keras


    【解决方案1】:

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


    上一个答案:

    由于

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

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2020-07-28
      • 2021-07-07
      • 2018-12-09
      相关资源
      最近更新 更多