Machine learning 神经网络异或门

Machine learning 神经网络异或门,machine-learning,neural-network,tensorflow,Machine Learning,Neural Network,Tensorflow,我试图用tensorflow实现一个异或门。我成功地实现了这一点,但我不完全理解它为什么有效。我得到了stackoverflow posts和的帮助。因此,具有一个热真值的和不具有一个热真值的输出。这里是我所了解的网络,为了把事情弄清楚 我的问题#1: 注意RELU函数和Sigmoid函数。为什么我们需要它(特别是RELU函数)?你可以说,为了实现非线性。我了解RELU如何实现非线性。我从他那里得到了答案。现在,根据我的理解,使用RELU和不使用RELU之间的区别是(见图)。[我测试了tf.nn

我试图用tensorflow实现一个异或门。我成功地实现了这一点,但我不完全理解它为什么有效。我得到了stackoverflow posts和的帮助。因此,具有一个热真值的
和不具有一个热真值的
输出。这里是我所了解的网络,为了把事情弄清楚

我的问题#1: 注意
RELU
函数和
Sigmoid
函数。为什么我们需要它(特别是
RELU
函数)?你可以说,为了实现非线性。我了解
RELU
如何实现非线性。我从他那里得到了答案。现在,根据我的理解,使用
RELU
和不使用
RELU
之间的区别是(见图)。[我测试了
tf.nn.RELU
函数。输出如下]

现在,如果第一个函数起作用,为什么第二个函数不起作用?从我的角度来看,
RELU
通过组合多个线性函数来实现非线性。所以两者都是线性函数(上两个)。如果第一个达到非线性,第二个也应该,不是吗?问题是,如果不使用
RELU
,为什么网络会卡住

具有一个热真输出的异或门

hidden1\u神经元=10
def网络(x、权重、偏差):
layer1=tf.nn.relu(tf.matmul(x,权重['h1'])+偏差['h1']))
layer_final=tf.matmul(layer1,权重['out'])+偏差['out']
返回层\最终
重量={
'h1':tf.变量(tf.random_normal([2,hidden1_neuron]),
'out':tf.变量(tf.random_normal([hidden1_neuron,2]))
}
偏差={
'h1':tf.变量(tf.random_normal([hidden1_neuron]),
'out':tf.Variable(tf.random_normal([2]))
}
x=tf.placeholder(tf.float32,[None,2])
y=tf.placeholder(tf.float32,[None,2])
净=网络(x、重量、偏差)
交叉熵=tf.nn.softmax交叉熵(净,y)
损失=tf.减少平均值(交叉熵)
列op=tf.列AdamOptimizer(0.2).最小化(损失)
初始化所有变量()
xTrain=np.数组([[0,0],[0,1],[1,0],[1,1]]
yTrain=np.数组([[1,0],[0,1],[0,1],[1,0]]
使用tf.Session()作为sess:
sess.run(初始化操作)
对于范围(5000)内的i:
列车数据=sess.run(列车运行,进站指令={x:xTrain,y:yTrain})
loss_val=sess.run(loss,feed_dict={x:xTrain,y:yTrain})
如果(不是(i%500)):
打印(丢失)
result=sess.run(net,feed_dict={x:xTrain})
打印(结果)
您在上面看到的代码实现了带有一个热真输出的异或门。如果我取出
tf.nn.relu
,网络就会卡住。为什么?

我的问题#2: 我如何理解网络是否会陷入局部极小值[或某个值]?它是从成本函数(或损失函数)图中得出的吗?比如,对于上面设计的网络,我使用交叉熵作为损失函数。我找不到交叉熵函数的绘图。(如果您可以提供,这将非常有帮助。)

我的问题#3: 注意代码上有一行
hidden1\u neuron=10
。这意味着我已经设置了隐藏层中神经元的数量
10
。将神经元数量减少到
5
会使网络陷入困境。那么隐藏层上的神经元数量应该是多少呢

网络按预期方式工作时的输出:

2.42076
0.000456363
0.000149548
7.40216e-05
4.34194e-05
2.78939e-05
1.8924e-05
1.33214e-05
9.62602e-06
7.06308e-06
[[ 7.5128479  -7.58900356]
[-5.65254211  5.28509617]
[-6.96340656  6.62380219]
[ 7.26610374 -5.9665451 ]]
网络卡住时的输出:

1.45679
0.346579
0.346575
0.346575
0.346574
0.346574
0.346574
0.346574
0.346574
0.346574
[[ 15.70696926 -18.21559143]
[ -7.1562047    9.75774956]
[ -0.03214722  -0.03214724]
[ -0.03214722  -0.03214724]]
问题1 ReLU函数和Sigmoid函数都是非线性的。相反,在ReLU函数右侧绘制的函数是线性的。应用多个线性激活函数仍将使网络线性化

因此,当试图对非线性问题执行线性回归时,网络会陷入困境

问题2 是的,您必须注意错误率的进展。在较大的问题实例中,您通常会注意测试集上错误函数的开发。这是通过在一段时间的培训后测量网络的准确性来完成的

问题3
异或问题至少需要2个输入节点、2个隐藏节点和1个输出节点,也就是说:需要5个节点才能用一个简单的神经网络对异或问题进行正确建模。

了解第一个节点。对于第二个问题,我能预测神经网络可能陷入局部极小值吗?例如,如果您看到rastrigin函数,您可以看到它有许多局部极小值。交叉熵也可以这样说吗?我找不到情节。对于第三个,我使用了5个隐藏层神经元。那么2个输入,5个隐藏,2个输出(一个热态为真),那么9个神经元或节点不工作?为什么会这样?不,你无法预见你是否正在接近一个局部最优解,但你很可能会陷入其中。有一些技巧可以避免局部极小值,比如增加动量和使用衰减#3异或问题对于神经网络来说是一个很难学习的问题,不清楚为什么你的特定网络在2-5-2拓扑结构下难以有效运行。我的意思是,当你设计一个神经网络时,有可能理解隐藏层中的神经元数量是多少?或者假设一个较大的值,然后降低以查看影响。有点像试错法?顺便说一句,当我在没有一个热真输出的情况下实现XOR门时(使用sigmoid),它可以使用2个输入、2个隐藏、1个输出进行学习