带有神经网络的 XOR 门
XOR gate with a neural network
我试图用 tensorflow 实现异或门。我成功地实现了它,但我不完全理解它为什么起作用。我从 Whosebug 的帖子 and . So both with one hot true
and without one hot true
outputs. Here is the network as i understood, in order to set things clear.
得到了帮助
我的问题 #1:
注意 RELU
函数和 Sigmoid
函数。为什么我们需要那个(特别是 RELU
函数)?你可能会说,为了实现非线性。我了解 RELU
如何实现非线性。我从 here 得到了答案。现在据我了解,使用 RELU
和不使用 RELU
的区别是这个(见图)。[我测试了 tf.nn.relu
函数。输出是这样的]
现在,如果第一个功能有效,为什么第二个功能不行?从我的角度来看 RELU
通过组合多个线性函数来实现非线性。所以两者都是线性函数(上两个)。如果第一个实现非线性,第二个也应该,不是吗?问题是,不使用 RELU
为什么网络会卡住?
具有一个热真实输出的异或门
hidden1_neuron = 10
def Network(x, weights, bias):
layer1 = tf.nn.relu(tf.matmul(x, weights['h1']) + bias['h1'])
layer_final = tf.matmul(layer1, weights['out']) + bias['out']
return layer_final
weight = {
'h1' : tf.Variable(tf.random_normal([2, hidden1_neuron])),
'out': tf.Variable(tf.random_normal([hidden1_neuron, 2]))
}
bias = {
'h1' : tf.Variable(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])
net = Network(x, weight, bias)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(net, y)
loss = tf.reduce_mean(cross_entropy)
train_op = tf.train.AdamOptimizer(0.2).minimize(loss)
init_op = tf.initialize_all_variables()
xTrain = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
yTrain = np.array([[1, 0], [0, 1], [0, 1], [1, 0]])
with tf.Session() as sess:
sess.run(init_op)
for i in range(5000):
train_data = sess.run(train_op, feed_dict={x: xTrain, y: yTrain})
loss_val = sess.run(loss, feed_dict={x: xTrain, y: yTrain})
if(not(i%500)):
print(loss_val)
result = sess.run(net, feed_dict={x:xTrain})
print(result)
您在上面看到的代码实现了具有一个热真实输出的 XOR 门。如果我取出 tf.nn.relu
,网络就会卡住。为什么?
我的问题 #2:
我如何理解网络是否会卡在某个局部最小值 [或某个值] 上?是来自成本函数(或损失函数)的图吗?比如说,对于上面设计的网络,我使用交叉熵作为损失函数。我找不到交叉熵函数的绘图。 (如果你能提供这个,这将非常有帮助。)
我的问题 #3:
请注意代码中有一行 hidden1_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函数都是non-linear。相反,绘制在 ReLU 函数右边的函数是线性的。应用多个线性激活函数仍然会使网络线性化。
因此,当尝试对 non-linear 问题执行线性回归时,网络会卡住。
问题 2
是的,您将不得不注意错误率的进展。在较大的问题实例中,您通常会注意测试集上误差函数的开发。这是通过在训练一段时间后测量网络的准确性来完成的。
问题 3
异或问题至少需要2个输入、2个隐藏和1个输出节点,即:需要5个节点才能用简单的神经网络正确建模异或问题。
我试图用 tensorflow 实现异或门。我成功地实现了它,但我不完全理解它为什么起作用。我从 Whosebug 的帖子 one hot true
and without one hot true
outputs. Here is the network as i understood, in order to set things clear.
我的问题 #1:
注意 RELU
函数和 Sigmoid
函数。为什么我们需要那个(特别是 RELU
函数)?你可能会说,为了实现非线性。我了解 RELU
如何实现非线性。我从 here 得到了答案。现在据我了解,使用 RELU
和不使用 RELU
的区别是这个(见图)。[我测试了 tf.nn.relu
函数。输出是这样的]
现在,如果第一个功能有效,为什么第二个功能不行?从我的角度来看 RELU
通过组合多个线性函数来实现非线性。所以两者都是线性函数(上两个)。如果第一个实现非线性,第二个也应该,不是吗?问题是,不使用 RELU
为什么网络会卡住?
具有一个热真实输出的异或门
hidden1_neuron = 10
def Network(x, weights, bias):
layer1 = tf.nn.relu(tf.matmul(x, weights['h1']) + bias['h1'])
layer_final = tf.matmul(layer1, weights['out']) + bias['out']
return layer_final
weight = {
'h1' : tf.Variable(tf.random_normal([2, hidden1_neuron])),
'out': tf.Variable(tf.random_normal([hidden1_neuron, 2]))
}
bias = {
'h1' : tf.Variable(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])
net = Network(x, weight, bias)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(net, y)
loss = tf.reduce_mean(cross_entropy)
train_op = tf.train.AdamOptimizer(0.2).minimize(loss)
init_op = tf.initialize_all_variables()
xTrain = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
yTrain = np.array([[1, 0], [0, 1], [0, 1], [1, 0]])
with tf.Session() as sess:
sess.run(init_op)
for i in range(5000):
train_data = sess.run(train_op, feed_dict={x: xTrain, y: yTrain})
loss_val = sess.run(loss, feed_dict={x: xTrain, y: yTrain})
if(not(i%500)):
print(loss_val)
result = sess.run(net, feed_dict={x:xTrain})
print(result)
您在上面看到的代码实现了具有一个热真实输出的 XOR 门。如果我取出 tf.nn.relu
,网络就会卡住。为什么?
我的问题 #2: 我如何理解网络是否会卡在某个局部最小值 [或某个值] 上?是来自成本函数(或损失函数)的图吗?比如说,对于上面设计的网络,我使用交叉熵作为损失函数。我找不到交叉熵函数的绘图。 (如果你能提供这个,这将非常有帮助。)
我的问题 #3:
请注意代码中有一行 hidden1_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函数都是non-linear。相反,绘制在 ReLU 函数右边的函数是线性的。应用多个线性激活函数仍然会使网络线性化。
因此,当尝试对 non-linear 问题执行线性回归时,网络会卡住。
问题 2
是的,您将不得不注意错误率的进展。在较大的问题实例中,您通常会注意测试集上误差函数的开发。这是通过在训练一段时间后测量网络的准确性来完成的。
问题 3
异或问题至少需要2个输入、2个隐藏和1个输出节点,即:需要5个节点才能用简单的神经网络正确建模异或问题。