2016-04-11 9 views
1

予測を予測するためにMLPを使用してスパースデータをトレーニングしようとしています。しかし、テストデータの予測は、すべての観測値に対して同じ値を与えています。各レイヤーからアクティベーション機能を省略すると、結果が異なるようになります。 私のコードは以下の通りです:TensorFlowのMLPは、トレーニング後のすべての観測に対して同じ予測を提供しています。

# imports 
import numpy as np 
import tensorflow as tf 
import random 
import json 
from scipy.sparse import rand 


# Parameters 
learning_rate= 0.1 
training_epochs = 50 
batch_size = 100 

# Network Parameters 
m= 1000 #number of features 
n= 5000 # number of observations 

hidden_layers = [5,2,4,1,6] 
n_layers = len(hidden_layers) 
n_input = m 
n_classes = 1 # it's a regression problem 

X_train = rand(n, m, density=0.2,format = 'csr').todense().astype(np.float32) 
Y_train = np.random.randint(4, size=n) 


X_test = rand(200, m, density=0.2,format = 'csr').todense().astype(np.float32) 
Y_test = np.random.randint(4, size=200) 

# tf Graph input 
x = tf.placeholder("float", [None, n_input]) 
y = tf.placeholder("float", [None]) 


# Store layers weight & bias 
weights = {} 
biases = {} 
weights['h1']=tf.Variable(tf.random_normal([n_input, hidden_layers[0]])) #first matrice 
biases['b1'] = tf.Variable(tf.random_normal([hidden_layers[0]])) 

for i in xrange(2,n_layers+1): 
    weights['h'+str(i)]= tf.Variable(tf.random_normal([hidden_layers[i-2], hidden_layers[i-1]])) 
    biases['b'+str(i)] = tf.Variable(tf.random_normal([hidden_layers[i-1]])) 

weights['out']=tf.Variable(tf.random_normal([hidden_layers[-1], 1])) #matrice between last layer and output 
biases['out']= tf.Variable(tf.random_normal([1])) 


# Create model 
def multilayer_perceptron(_X, _weights, _biases): 
    layer_begin = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1'],a_is_sparse=True), _biases['b1'])) 

    for layer in xrange(2,n_layers+1): 
     layer_begin = tf.nn.relu(tf.add(tf.matmul(layer_begin, _weights['h'+str(layer)]), _biases['b'+str(layer)])) 
     #layer_end = tf.nn.dropout(layer_begin, 0.3) 

    return tf.matmul(layer_begin, _weights['out'])+ _biases['out'] 


# Construct model 
pred = multilayer_perceptron(x, weights, biases) 



# Define loss and optimizer 
rmse = tf.reduce_sum(tf.abs(y-pred))/tf.reduce_sum(tf.abs(y)) # rmse loss 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(rmse) # Adam Optimizer 

# Initializing the variables 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 

    #training 
    for step in xrange(training_epochs): 

     # Generate a minibatch. 
     start = random.randrange(1, n - batch_size) 
     #print start 
     batch_xs=X_train[start:start+batch_size,:] 
     batch_ys =Y_train[start:start+batch_size] 

     #printing 
     _,rmseRes = sess.run([optimizer, rmse] , feed_dict={x: batch_xs, y: batch_ys}) 
     if step % 20 == 0: 
      print "rmse [%s] = %s" % (step, rmseRes) 


    #testing 
    pred_test = multilayer_perceptron(X_test, weights, biases) 
    print "prediction", pred_test.eval()[:20] 
    print "actual = ", Y_test[:20] 

PS:私はちょうど、エラーを再現するために、ランダムに私のデータを生成しています。私のデータは無作為に生成されたものと非常に似ています。私が解決したい問題は次のとおりです。MLPは、テストデータ内のすべての観測に対して同じ予測を与えています。

+0

おそらくこれは私の知らないことですが、完全にランダムなデータを訓練するとMLPが収束すると予想するのは妥当でしょうか?そして、たとえそれがあったとしても、学習されたパラメータが、ランダムに生成された独立したテストセットでランダム性の精度を上回ると期待することは妥当でしょうか? – Aenimated1

+0

ありがとうございます。実際にあなたが言ったことにはある点があります。しかし、私はエラーを再現するためにここにランダムにデータを生成しています。それは私の実際のデータではありませんが、それに近いです、それはまばらです。その後、問題はニューラルネットが収束しているかどうかではなく、問題はすべての観測に対して「同じ予測」であるということではありません。 – chikhawi9

答えて

1

これは、トレーニングが失敗したという兆候です。 GoogeLeNet Imagenetのトレーニングでは、ハイパーパラメータの悪い選択から始まったときにすべてを "線虫"とラベル付けしています。確認すべき事項 - トレーニングの損失は減少しますか?それが減少しない場合は、異なる学習率/アーキテクチャを試してください。それが0になると、あなたの損失は間違っているかもしれません。here

+0

ありがとうございます。はい、いくつかのハイパーパラメータ(学習率/各層の層数/ニューロン数)を試しました。時には私は別の予測( "小さな"サイズのネットワーク)を持っており、ほとんどの場合、現実から遠い同じ予測や予測があります。損失関数はゆっくりと減少しています(増加する場合もあるが、安定しない場合もあります)。私はあなたが推奨するように他の損失機能を試みます。 – chikhawi9

関連する問題