簡體   English   中英

不可能訓練神經網絡計算異或

[英]It is not possible to train a neural network compute xor

請告訴我我做錯了什么,為什么精度沒有提高? 我嘗試了所有事情,增加了層次,增加和減少了迭代次數,甚至嘗試安裝輟學(即使我沒有在這里進行再培訓),但是它沒有成功:(

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)

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)

這里有很多問題。 不,這並非不可能(*)

輟學與您的問題無關(**)。 您使用的是softmax,然后是relu? 我覺得這很奇怪。 您為什么要強制分類? 當您有這么小的輸入示例(10個樣本,但隱藏層上有300個參數)時,為什么要使用如此大的網絡?

這里開始 ,一個帶有keras的xor的最小示例:

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無法學習xor。 證明示例在這里

(**)當您擁有深層網絡時,Dropout有助於進行泛化。 當訓練大型模型以檢測圖像中的人類等復雜的高維結構時,這一點至關重要。 嘗試使用xor會讓您的生活更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM