最近我开始玩弄神经网络。我试图用Tensorflow实现一个AND
门。我无法理解何时使用不同的成本和激活功能。这是一个基本的神经网络,只有输入和输出层,没有隐藏层。从神经网络的不同成本函数和激活函数中选择
首先我试图用这种方式实现它。正如你可以看到这是一个糟糕的实现,但我认为它完成了工作,至少在某种程度上。所以,我只尝试了真正的输出,没有一个真正的输出。对于激活函数,我使用sigmoid函数,对于成本函数,我使用了平方误差成本函数(我认为它是所谓的,如果我错了,请纠正我)。
我试过使用ReLU和Softmax作为激活函数(具有相同的成本函数),它不起作用。我找出他们为什么不工作。我也尝试了交叉熵成本函数的sigmoid函数,但它也不起作用。
import tensorflow as tf
import numpy
train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[0],[0],[0],[1]])
x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 1])
W = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1, 1]))
activation = tf.nn.sigmoid(tf.matmul(x, W)+b)
cost = tf.reduce_sum(tf.square(activation - y))/4
optimizer = tf.train.GradientDescentOptimizer(.1).minimize(cost)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(5000):
train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})
result = sess.run(activation, feed_dict={x:train_X})
print(result)
后5000次迭代:
[[ 0.0031316 ]
[ 0.12012422]
[ 0.12012422]
[ 0.85576665]]
问题1 - 是否有任何其他的激活功能和成本的功能,即可以工作(学习)上述网络,在不改变参数(意思而不改变W,x,b)。
问题2 - 我从StackOverflow的后here阅读:
[激活功能]选择取决于这个问题。
因此,有可以在任何地方使用任何费用的功能呢?我的意思是没有标准成本函数,可用于任何神经网络。对?请在此纠正我。
我还执行了AND
栅极与不同的方法,将具有输出作为独热真。正如你可以看到train_Y
[1,0]
意味着第0个索引是1,所以答案是0.我希望你能得到它。
在这里,我已经使用了一个SOFTMAX激活功能,具有交叉熵成本函数。 Sigmoid功能作为激活功能失败了。
import tensorflow as tf
import numpy
train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[1,0],[1,0],[1,0],[0,1]])
x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 2])
W = tf.Variable(tf.zeros([2, 2]))
b = tf.Variable(tf.zeros([2]))
activation = tf.nn.softmax(tf.matmul(x, W)+b)
cost = -tf.reduce_sum(y*tf.log(activation))
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cost)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(5000):
train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})
result = sess.run(activation, feed_dict={x:train_X})
print(result)
后5000迭代
[[ 1.00000000e+00 1.41971401e-09]
[ 9.98996437e-01 1.00352429e-03]
[ 9.98996437e-01 1.00352429e-03]
[ 1.40495342e-03 9.98595059e-01]]
问题3因此,在这种情况下,我可以使用什么样的代价函数和激活功能?我如何理解我应该使用哪种类型的成本和激活功能?有没有一个标准的方式或规则,或只是经验?我是否应该以暴力方式尝试每一项成本和激活功能?我找到了答案here。但我希望能有更详尽的解释。
问题4我注意到需要很多迭代才能收敛到接近准确的预测。我认为,收敛速度取决于学习速度(使用过大的将错过解决方案)和成本函数(纠正我,如果我错了)。那么,是否有任何最佳途径(意思是最快)或成本函数来收敛到正确的解决方案?