【问题标题】:It is not possible to train a neural network compute xor不可能训练神经网络计算异或
【发布时间】:2018-08-15 14:48:23
【问题描述】:

请告诉我我做错了什么,为什么准确性没有提高? 我尝试了一切,添加了层,增加和减少了迭代次数,甚至尝试安装 dropout(即使我在这里没有重新训练),但它没有成功:(

from __future__ import print_function
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.utils import np_utils
from keras.layers import Dropout

np.random.seed()

NB_EPOCH = 100
VERBOSE = 1
NB_CLASSES = 2

X_in = [[1,0],[1,1],[0,0],[0,1],[1,1],[0,0],[1,1]]
X_answer = [1,0,0,1,0,0,0]
X_in = np.asarray(X_in, dtype=np.float32)
X_answer = np.asarray(X_answer, dtype=np.float32)
X_answer = np_utils.to_categorical(X_answer, NB_CLASSES)

model = Sequential()
model.add(Dense(300, input_dim = 2, activation='relu'))
model.add(Dense(300, input_dim = 300, activation='softmax'))
model.add(Dense(2, input_dim = 300, activation='relu'))
#model.summary()

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(X_in, X_answer, epochs=NB_EPOCH, verbose=VERBOSE)

【问题讨论】:

    标签: python numpy tensorflow keras


    【解决方案1】:

    XOR 操作只有 4 种可能的结果,我已经稍微改变了你的源代码,所以它现在工作得很好,但是需要几百次迭代才能学习必要的东西:

    #!/usr/bin/env python
    
    import numpy as np
    
    from keras.models import Sequential
    from keras.layers.core import Dense, Activation
    from keras.utils import np_utils
    from keras.layers import Dropout
    
    np.random.seed()
    
    NB_EPOCH = 1000
    VERBOSE = 1
    NB_CLASSES = 2
    
    X_in = [[1,0],[1,1],[0,0],[0,1]]
    X_answer = [[0,1],[1,0],[1,0],[0,1]]
    X_in = np.asarray(X_in, dtype=np.float32)
    X_answer = np.asarray(X_answer, dtype=np.float32)
    #X_answer = np_utils.to_categorical(X_answer, NB_CLASSES)
    
    model = Sequential()
    model.add(Dense(10, input_dim = 2, activation='relu'))
    model.add(Dense(10, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    
    #model.summary()
    
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    history = model.fit(X_in, X_answer, nb_epoch=NB_EPOCH, verbose=VERBOSE)
    
    print model.predict( X_in )
    

    结果是:

    Epoch 995/1000
    4/4 [==============================] - 0s - loss: 0.1393 - acc: 1.0000
    Epoch 996/1000
    4/4 [==============================] - 0s - loss: 0.1390 - acc: 1.0000
    Epoch 997/1000
    4/4 [==============================] - 0s - loss: 0.1387 - acc: 1.0000
    Epoch 998/1000
    4/4 [==============================] - 0s - loss: 0.1385 - acc: 1.0000
    Epoch 999/1000
    4/4 [==============================] - 0s - loss: 0.1383 - acc: 1.0000
    Epoch 1000/1000
    4/4 [==============================] - 0s - loss: 0.1380 - acc: 1.0000
    [[ 0.00492113  0.9950788 ]
     [ 0.99704748  0.0029525 ]
     [ 0.99383503  0.00616499]
     [ 0.00350395  0.99649602]]
    

    这真的很接近所需的[0,1],[1,0],[1,0],[0,1] (X_answer)

    【讨论】:

      【解决方案2】:

      这里有很多问题。不,这不是不可能的(*)

      Dropout 与您的问题无关 (**)。您使用的是softmax,然后是relu?这对我来说似乎很奇怪。你为什么要分类?当您有这么小的输入示例(10 个样本,但隐藏层上有 300 个参数)时,为什么要使用这么大的网络?

      来自here,一个最小的异或与keras的例子:

      X = np.array([[0,0],[0,1],[1,0],[1,1]])
      y = np.array([[0],[1],[1],[0]])
      
      model = Sequential()
      model.add(Dense(8, input_dim=2))
      model.add(Activation('tanh'))
      model.add(Dense(1))
      model.add(Activation('sigmoid'))
      
      sgd = SGD(lr=0.1)
      model.compile(loss='binary_crossentropy', optimizer=sgd)
      
      model.fit(X, y, show_accuracy=True, batch_size=1, nb_epoch=1000)
      print(model.predict_proba(X))
      

      (*) 您使用的是多层感知器,但标题引起了我的注意,因为有一个(相对)著名的证据表明没有隐藏层的 NN 无法学习异或。 Proof example here

      (**) 当你有深度网络时,Dropout 有助于泛化。这在训练大型模型以检测图像中的复杂高维结构(如人类)时至关重要。在尝试适应 xor 时,这会让你的生活变得更加困难。

      【讨论】:

        猜你喜欢
        • 2017-12-07
        • 2019-09-15
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        相关资源
        最近更新 更多