2017-11-02 11 views
0

TensorFlow RNN予測の新機能です。 私は私のコードがエラーを報告しませんが、すべてのバッチの出力が同じように見える、とコストがトレーニングしながら、減少させないように見えるようにRNNシーケンス学習

1,2,3,4,5 ->6 
3,4,5,6,7 ->8 
35,36,37,38,39 ->40 

として、シーケンスを予測するBasicLSTMCellとRNNを使用しようとしています。私は100

0.01,0.02,0.03,0.04,0.05 ->0.06 
0.03,0.04,0.05,0.06,0.07 ->0.08 
0.35,0.36,0.37,0.38,0.39 ->0.40 

により、すべてのトレーニングデータを分割すると

結果はかなり良いです、予測と実際の値との相関関係は(0.9998)が非常に高いです。

整数と浮動小数点の問題が原因だと思われますか?理由を説明することはできません。誰でも助けることができますか?どうもありがとう!!ここで

コード

library(tensorflow) 
start=sample(1:1000, 100000, T) 
start1= start+1 
start2=start1+1 
start3= start2+1 
start4=start3+1 
start5= start4+1 
start6=start5+1 
label=start6+1 
data=data.frame(start, start1, start2, start3, start4, start5, start6, label) 
data=as.matrix(data) 
n = nrow(data) 
trainIndex = sample(1:n, size = round(0.7*n), replace=FALSE) 
train = data[trainIndex ,] 
test = data[-trainIndex ,] 
train_data= train[,1:7] 
train_label= train[,8] 
means=apply(train_data, 2, mean) 
sds= apply(train_data, 2, sd) 
train_data=(train_data-means)/sds 
test_data=test[,1:7] 
test_data=(test_data-means)/sds 
test_label=test[,8] 
batch_size = 50L    
n_inputs = 1L    # MNIST data input (img shape: 28*28) 
n_steps = 7L    # time steps 
n_hidden_units = 10L  # neurons in hidden layer 
n_outputs = 1L    # MNIST classes (0-9 digits) 
x = tf$placeholder(tf$float32, shape(NULL, n_steps, n_inputs)) 
y = tf$placeholder(tf$float32, shape(NULL, 1L)) 
weights_in= tf$Variable(tf$random_normal(shape(n_inputs, n_hidden_units))) 
weights_out= tf$Variable(tf$random_normal(shape(n_hidden_units, 1L))) 
biases_in=tf$Variable(tf$constant(0.1, shape= shape(n_hidden_units))) 
biases_out = tf$Variable(tf$constant(0.1, shape=shape(1L))) 
RNN=function(X, weights_in, weights_out, biases_in, biases_out) 
{ 
    X = tf$reshape(X, shape=shape(-1, n_inputs)) 
    X_in = tf$sigmoid (tf$matmul(X, weights_in) + biases_in) 
    X_in = tf$reshape(X_in, shape=shape(-1, n_steps, n_hidden_units) 
    lstm_cell = tf$contrib$rnn$BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=T) 
    init_state = lstm_cell$zero_state(batch_size, dtype=tf$float32) 
    outputs_final_state = tf$nn$dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=F) 
    outputs= tf$unstack(tf$transpose(outputs_final_state[[1]], shape(1,0,2))) 
    results = tf$matmul(outputs[[length(outputs)]], weights_out) + biases_out 
    return(results) 
} 
pred = RNN(x, weights_in, weights_out, biases_in, biases_out) 
cost = tf$losses$mean_squared_error(pred, y) 
train_op = tf$contrib$layers$optimize_loss(loss=cost, global_step=tf$contrib$framework$get_global_step(), learning_rate=0.05, optimizer="SGD") 
init <- tf$global_variables_initializer() 
sess <- tf$Session() 
sess.run(init) 
    step = 0 
while (step < 1000) 
{ 
    train_data2= train_data[(step*batch_size+1) : (step*batch_size+batch_size) , ] 
    train_label2=train_label[(step*batch_size+1):(step*batch_size+batch_size)] 
    batch_xs <- sess$run(tf$reshape(train_data2, shape(batch_size, n_steps, n_inputs))) # Reshape 
    batch_ys= matrix(train_label2, ncol=1) 
    sess$run(train_op, feed_dict = dict(x = batch_xs, y= batch_ys)) 
mycost <- sess$run(cost, feed_dict = dict(x = batch_xs, y= batch_ys)) 
print (mycost) 
test_data2= test_data[(0*batch_size+1) : (0*batch_size+batch_size) , ] 
    test_label2=test_label[(0*batch_size+1):(0*batch_size+batch_size)] 
    batch_xs <- sess$run(tf$reshape(test_data2, shape(batch_size, n_steps, n_inputs))) # Reshape 
    batch_ys= matrix(test_label2, ncol=1) 
step=step+1 
} 
+1

いくつかのコードを共有できますか?それがなければ何が問題かを判断するのは難しいです。あなたのデータセットがとてもシンプルであれば、それほど高い相関関係を持つことも考えられません(あなたのデータセットにノイズ/エラーを導入するとまだ高いですか?) – Deruijter

+0

コメントありがとうございます。コードを追加しました。概念をテストしているだけなので、データセットは単純です。 – user2146141

答えて

1

まず、それは常に(異なるアプローチ、最大値で除算があり、STDと、より多くの意味と除算減算)ネットワーク入力を正規化するために非常に便利です。これはあなたのオプティマイザを多く助けます。

あなたのケースでは、実際に最も重要なのは、RNN出力後にシグモイド関数を適用することです。シグモイド関数のプロットをチェックすると、実際にすべての入力を範囲(0,1)にスケーリングすることがわかります。だから基本的に入力がどれくらい大きくても、出力は常に1になるでしょう。したがって、回帰問題の出力層では、どのようなアクティベーション関数も使用しないでください。

希望します。

+1

こんにちは。 フィーチャの正規化を追加してシグモイドアクティベーション関数を削除しましたが、これらの2つの変更が問題を解決しなかったようです。結果は同じようです。実際には、学習後、各バッチからの事前導入はかなり同じです。例えば、 の1つのバッチの場合、実際のYは、810,284,83 ... 35(50値) 予測されるyは、494.8970,494.8970 ..... 494.8970,494.8976(50値) 予測すべての実際のY(つまり500)の平均にかなり近づいています 解決方法や説明方法がわからない – user2146141

+0

@ user2146141入力とYの両方を正規化しましたか?両方を正規化してから出力の後ろを縮小してみてください...最後のレイヤーに(0,1)の入力があるので、ネットが最後にトレーニングされたときにWが固定値です。そのためネットワークは学習中にすべてのYの平均を学習するだけです。エラーが最小限に抑えられます。そうでなければ、(0,1)の数字で乗算され、同時に810と83になるWを得ることはできませんさまざまな入力のために – asakryukin

+0

それは助ける!どうもありがとう – user2146141