最近我開始玩弄神經網絡。我試圖用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我注意到需要很多迭代才能收斂到接近準確的預測。我認爲,收斂速度取決於學習速度(使用過大的將錯過解決方案)和成本函數(糾正我,如果我錯了)。那麼,是否有任何最佳途徑(意思是最快)或成本函數來收斂到正確的解決方案?