2017-07-17 3 views
0

Ich möchte eine Vorhersagefunktion mit Tensorflow in R implementieren, aber das Vorhersageergebnis ist immer das gleiche, egal was die Eingabeparameter sind.Tensorflow liefert die gleichen Ergebnisse für verschiedene trainierte Eingabeparameter

Ich habe versucht, ganz in der Nähe des offiziellen tutorial zu bleiben.

Meine Trainingsdaten sind in einem Datenrahmen von 7 Variablen geformt. Der erste ist das Ergebnis. Das Ergebnis ist entweder 0 oder 1.

Mein vollständiger Code ist:

sess <- tf$InteractiveSession() 

x <- tf$placeholder(tf$float32, shape(NULL,6L)) 
y_ <- tf$placeholder(tf$float32, shape(NULL,2L)) 

W <- tf$Variable(tf$zeros(shape(6L, 1L))) 
b <- tf$Variable(tf$zeros(shape(2L))) 

sess$run(tf$global_variables_initializer()) 
y <- tf$nn$softmax(tf$matmul(x,W) + b) 
cross_entropy <- tf$reduce_mean(-tf$reduce_sum(y_ * tf$log(y), reduction_indices=1L)) 
optimizer <- tf$train$GradientDescentOptimizer(0.5) 
train_step <- optimizer$minimize(cross_entropy) 

i = 1 
while (i < (nrow(training_data)-20)) { 
    print(i) 
    batch_ys <- matrix(c(training_data[i:(i+19),1], abs(training_data[i:(i+19),1]-1)), nrow=20) 
    batch_xs <- matrix(c(training_data[i:(i+19),2],training_data[i:(i+19),3],training_data[i:(i+19),4],training_data[i:(i+19),5],training_data[i:(i+19),6],training_data[i:(i+19),7]), nrow=20, ncol=6) 

    sess$run(train_step, feed_dict = dict(x = batch_xs, y_ = batch_ys)) 
    i = i + 20 
} 

Und eine einfache Prüfung mit den ersten Elementen der Trainingsdatum

# Simple verification 
for (j in 1:30){ 
    test_data <- c(training_data[j,2],training_data[j,3],training_data[j,4],training_data[j,5],training_data[j,6],training_data[j,7]) 
    test_data <- matrix(test_data, nrow = 1, ncol = 6) 
    feed_dict = dict(x= test_data) 
    print('############') 
    print(sess$run(y,feed_dict)) # this is always the same 
    print(training_data[j,1]) 
} 

ich erwartete, dass die Vorhersage von abhängt auf der Eingabe, aber es gibt zurück:

[1] "############" 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 2 2 4 74 5 2 
     [,1]  [,2] 
[1,] 0.0657808 0.9342192 
[1] 1 
[1] "############" 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 0 1 5 61 2 3 
     [,1]  [,2] 
[1,] 0.0657808 0.9342192 
[1] 0 
[1] "############" 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 2 6 85 5 4 
     [,1]  [,2] 
[1,] 0.0657808 0.9342192 
[1] 0 

Was habe ich falsch gemacht?

Danke,

Bastian

Antwort

0

Ich habe herausgefunden, warum es nicht mit den Daten funktioniert. Der Code funktionierte wirklich gut, aber die Eingabedaten wurden nicht zwischen 0 und 1 skaliert.

Ich denke alle Werte über 1 wurden auf 1 gesetzt (zB 32kg -> 1), also wurde das Nnet nur trainiert mit Tabellen, die mit 1 gefüllt sind. Aufgrund der gleichen Eingabewerte für jede Ausgabeklassifizierung war das Ergebnis ein konstanter Wert.

0

Es scheint, dass Problem in dieser Zeile ist:

W <- tf$Variable(tf$zeros(shape(6L, 1L))) 

Wie Sie Gewichtungsmatrix mit Nullen zu initialisieren, alle Steigungen werden Nullen als gut. So ist auch nach einigen Trainings-Iterationen W immer noch eine Matrix aus Nullen. Die Lösung besteht darin, kleine zufällige Werte zu verwenden, um diese Matrix zu initialisieren.

+0

Ich habe versucht, W mit 'tf $ random_normal 'zu initialisieren, aber das Problem ist immer noch da. – user2667549

Verwandte Themen