Kürzlich begann ich mit neuronalen Netzen zu spielen. Ich habe versucht, ein AND
Tor mit Tensorflow zu implementieren. Ich habe Probleme zu verstehen, wann verschiedene Kosten und Aktivierungsfunktionen verwendet werden. Dies ist ein grundlegendes neuronales Netzwerk mit nur Eingabe- und Ausgabeschichten, keine versteckten Schichten.Auswahl aus verschiedenen Kostenfunktion und Aktivierungsfunktion eines neuronalen Netzes
Zuerst habe ich versucht, es auf diese Weise zu implementieren. Wie Sie sehen können, ist dies eine schlechte Implementierung, aber ich denke, dass es die Aufgabe erledigt, zumindest in gewisser Weise. Also habe ich nur die echten Ausgänge ausprobiert, keine heißen Ausgänge. Für Aktivierungsfunktionen verwendete ich eine Sigmoid-Funktion und für die Kostenfunktion verwendete ich die quadratische Fehlerkostenfunktion (ich glaube, sie heißt das, korrigiere mich, wenn ich falsch liege).
Ich habe versucht, ReLU und Softmax als Aktivierungsfunktionen (mit der gleichen Kostenfunktion) und es funktioniert nicht. Ich habe herausgefunden, warum sie nicht arbeiten. Ich habe auch versucht, die Sigmoid-Funktion mit Cross Entropy Kostenfunktion, es funktioniert auch nicht.
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)
nach 5000 Iterationen:
[[ 0.0031316 ]
[ 0.12012422]
[ 0.12012422]
[ 0.85576665]]
Frage 1 - Gibt es eine andere Aktivierungsfunktion und Kostenfunktion, die (weiteren) für das oben Netzwerk arbeiten kann, ohne die Parameter zu ändern (was bedeutet, ohne W zu ändern, x, b).
Frage 2 - ich las von einem Stackoverflow Post here:
[Aktivierungs-Funktion] Auswahl auf das Problem abhängt.
Also gibt es keine Kostenfunktionen, die überall verwendet werden können? Ich meine, es gibt keine Standard Kostenfunktion, die auf jedem neuronalen Netzwerk verwendet werden kann. Recht? Bitte korrigieren Sie mich dazu.
ich implementiert auch das AND
Tor mit einem anderen Ansatz, wobei der Ausgang als One-Hot wahr. Wie Sie sehen können, train_Y
[1,0]
bedeutet, dass der 0. Index ist 1, also ist die Antwort 0. Ich hoffe, Sie bekommen es.
Hier habe ich eine Softmax-Aktivierungsfunktion verwendet, mit Kreuz-Entropie als Kostenfunktion. Die Sigmoidfunktion als Aktivierungsfunktion versagt kläglich.
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)
nach 5000 Iteration
[[ 1.00000000e+00 1.41971401e-09]
[ 9.98996437e-01 1.00352429e-03]
[ 9.98996437e-01 1.00352429e-03]
[ 1.40495342e-03 9.98595059e-01]]
Frage 3 Also in diesem Fall, was Kostenfunktion und Aktivierungsfunktion kann ich verwenden? Wie kann ich verstehen, welche Art von Kosten und Aktivierungsfunktionen ich verwenden soll? Gibt es einen Standardweg oder eine Standardregel oder nur Erfahrung? Muss ich jede Kosten- und Aktivierungsfunktion rohe Gewalt anwenden? Ich habe eine Antwort gefunden here. Aber ich hoffe auf eine ausführlichere Erklärung.
Frage 4 Ich habe festgestellt, dass es viele Iterationen braucht, um zu einer nahezu genauen Vorhersage zu konvergieren.Ich denke, dass die Konvergenzrate von der Lernrate abhängt (zu viel davon wird die Lösung verfehlen) und die Kostenfunktion (korrigiere mich, wenn ich falsch liege). Gibt es also einen optimalen Weg (dh die schnellste) oder Kostenfunktion für die Konvergenz zu einer korrekten Lösung?