2

Ich versuche, einen sehr einfachen binären Klassifikator in Tensorflow auf generierten Daten zu erstellen.Steigungen von logischen Operatoren in Tensorflow

Ich erzeuge Zufallsdaten aus zwei separaten Normalverteilungen. Dann werde ich die resultierenden Daten zu einer binären Klasse klassifizieren, wenn sie kleiner oder größer als eine Zahl ist.

Idealerweise wird A ein Cutoff in der Mitte beider Normalen sein. Z.B. wenn meine Daten von N (1,1) + N (-1,1) erzeugt werden, dann sollte A ungefähr 0 sein.

Ich laufe auf einen Fehler "keine Gradienten für jede Variable vorausgesetzt ..." . Im Einzelnen:

No gradients provided for any variable: ((None, <tensorflow.python.ops.variables.Variable object at 0x7fd9e3fae710>),) 

ich denke, es kann mit der Tatsache zu tun hat, dass Tensorflow nicht Steigungen für logische Operatoren berechnen kann. Meine Einstufung für jeden A-Wert gegeben wird angenommen, wie etwas sein:

ein Datenpunkt x gegeben und ein A-Wert:

[1,0]: wenn x < A

[0,1 ]: wenn x> = A

diese Idee gegeben, hier ist meine Berechnung in Tensorflow für die Ausgabe:

my_output = tf.concat(0,[tf.to_float(tf.less(x_data, A)), tf.to_float(tf.greater_equal(x_data, A))]) 

ist dies der falsche Weg, um diese Ausgabe zu implementieren? Gibt es ein nicht logisches funktionales Äquivalent?

Danke. Wenn Sie meinen ganzen Code sehen wollen, hier ist ein Kern: https://gist.github.com/nfmcclure/46c323f0a55ae1628808f7a58b5d437f


bearbeiten: Voll Stack Trace:

Traceback (most recent call last): 

    File "<ipython-input-182-f8837927493d>", line 1, in <module> 
    runfile('/.../back_propagation.py', wdir='/') 

    File "/usr/local/lib/python3.4/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile 
execfile(filename, namespace) 

    File "/usr/local/lib/python3.4/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 88, in execfile 
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 

    File "/.../back_propagation.py", line 94, in <module> 
train_step = my_opt.minimize(xentropy) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/training/optimizer.py", line 192, in minimize 
name=name) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/training/optimizer.py", line 286, in apply_gradients 
(grads_and_vars,)) 

ValueError: No gradients provided for any variable: ((None, <tensorflow.python.ops.variables.Variable object at 0x7fd9e3fae710>),) 
+0

Ein voller Stack-Trace könnte helfen – KevinOrr

Antwort

1

Normalerweise würden Sie eine S-förmige Funktion verwenden, um die Ausgabe an Pin von Ihrer Funktion in den Bereich von 0 bis 1. Sie möchten folgende Funktion trainieren:

y = a * x_eingabe + b, wobei a und b trainierbare Variablen sind.

Der Verlust Funktion würden Sie dann verwenden, wäre tf.sigmoid_cross_entropy_with_logits

Und die Klasse bewerten Sie würden sigmoid (y)> 0,5 bewerten. Der Operator "größer als logischer Operator" verfügt nicht über einen Farbverlauf, um eine Optimierungsfunktion zu erstellen.

+0

Vielen Dank, ich werde wahrscheinlich auf ein Sigmoid oder eine kontinuierliche Annäherung an eine Schrittfunktion wechseln. – nfmcclure

1

Die Schwellenwertfunktion, die Sie verwenden möchten, ist an der Schwelle nicht differenzierbar, und die Ableitung ist überall sonst Null. Wie szabadaba erwähnt, würden Sie normalerweise eine sigmoidale Funktion als Ausgang eines binären Klassifikators verwenden. Verwenden Sie für die Klassifizierung mit mehreren Klassen eine softmax-Funktion. Diese Funktionen können so interpretiert werden, dass sie Ihnen eine Wahrscheinlichkeit oder Konfidenz für den Klassenwert geben (was schöner ist, als nur einen harten Wert zu erhalten). Wichtig ist, dass die Gradienten sich gut benehmen. Aber Sie müssen darauf achten, die Einheiten nicht zu sättigen.

Zum Beispiel finden Sie unter:

LeCun (1998). Effizientes BackProp.

Im Fall der binären Klassifikation w/s-förmige Ausgänge, macht er einige interessante Punkte über in der nicht-gesättigten Regime bleiben durch die besondere Sigmoidfunktion Wahl, die richtige Zuordnung zu Klasse Etiketten für die S-förmige usw.

Es wäre wahrscheinlich hilfreich, ein Tutorial zur logistischen Regression zu lesen. Hier ist eine für TensorFlow und eine für Theano.

1

ich thnink vielleicht sollten Sie nicht my_output berechnen den Verlust verwenden, becasuse vielleicht kann tf nicht die Rückwärts Gradienten in tf.less und tf.greater Betrieb berechnen suppot könnten Sie den Verlust versuchen berechnen Funktion in x_data

Verwandte Themen