2017-07-17 19 views
0

Rでテンソルフローを使用して予測関数を実装したいが、入力パラメータが何であっても予測結果は常に同じです。Tensorflowは、異なる訓練された入力パラメータについて同じ結果を返します

私は実際に公式tutorialの近くに滞在しようとしました。

私のトレーニングデータは、7つの変数のdata.frameで整形されています。最初のものが結果です。結果は0または1

私の完全なコードは次のとおりです。

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 
} 

とトレーニングデータ

# 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]) 
} 

の最初の項目と簡単なチェックは、私はの予測が依存していることを期待入力では、それは返します:

[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 

私は間違って何をしましたか?

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

あなたがゼロと重み行列を初期化すると、すべての勾配は、同様にゼロになります。

おかげで、

バスティアン

答えて

0

私は、なぜデータではうまくいかないのか考え出しました。 コードは本当にうまくいっていますが、入力データは0と1の間でスケーリングされていませんでした。

1より大きいすべての値が1に設定されていると思われます(32kg - > 1など)。表は1で埋められていました。すべての出力分類に同じ入力値があったため、結果は一定の値でした。

0

は、その問題は、この行にあるようです。したがって、いくつかのトレーニング反復の後でさえも、Wは依然としてゼロの行列です。解決策は、この行列を初期化するために小さなランダム値を使用することです。

+0

私は 'tf $ random_normal'でWを初期化しようとしましたが、まだ問題は残っています。 – user2667549

関連する問題