Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 训练神经网络计算异或是不可能的_Python_Numpy_Tensorflow_Keras - Fatal编程技术网

Python 训练神经网络计算异或是不可能的

Python 训练神经网络计算异或是不可能的,python,numpy,tensorflow,keras,Python,Numpy,Tensorflow,Keras,请告诉我我做错了什么,为什么准确率没有提高? 我尝试了一切,添加了层,增加和减少了迭代次数,甚至尝试了安装dropout(尽管我在这里没有接受过再培训),但没有成功:( 这里有很多问题。不,这不是不可能的(*) 辍学与你的问题(**)无关。你使用的是softmax,然后是relu?这对我来说似乎很奇怪。你为什么选择分类?为什么你有这么小的输入示例(10个示例,但隐藏层上有300个参数),却使用这么大的网络 从中可以看出,xor与keras的一个最小示例: X = np.array([[0,0],

请告诉我我做错了什么,为什么准确率没有提高? 我尝试了一切,添加了层,增加和减少了迭代次数,甚至尝试了安装dropout(尽管我在这里没有接受过再培训),但没有成功:(


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

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

从中可以看出,xor与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无法学习xor


(**)当你拥有深度网络时,辍学有助于泛化。当训练大型模型来检测图像中复杂的高维结构(如人类)时,这一点至关重要。当尝试适应xor时,这将使你的生活更加困难。

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_答案)

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]]