2016-04-11 3 views
1

Я пытаюсь подготовить редкие данные с помощью MLP для прогнозирования прогноза. Однако прогноз по данным испытаний дает одинаковое значение для всех наблюдений. Как только я опускаю функцию активации из каждого слоя, результат начинает отличаться. мой код ниже:MLP на TensorFlow дает то же предсказание для всех наблюдений после тренировки

# 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

Спасибо. На самом деле есть смысл в том, что вы сказали. Но я произвольно генерирую данные, чтобы воспроизвести ошибку. Это не мои настоящие данные, но это близко к этому, оно скудное. Тогда проблема не в том, что Neural Net сходится или нет, проблема в том, что «то же предсказание» для всех наблюдений - это тестовые данные. – chikhawi9

ответ

1

Это признак того, что ваше обучение не удалось. С обучением GoogeLeNet Imagenet я видел, как он маркировал все как «нематоду», когда начинался с плохого выбора гиперпараметров. Что нужно проверить - уменьшается ли ваша потеря обучения? Если это не уменьшится, попробуйте разные курсы/архитектуры обучения. Если он уменьшится до нуля, возможно, ваша потеря будет неправильной, как в случае here

+0

Спасибо. Да, я пробовал несколько гиперпараметров (скорость обучения/количество слоев/количество нейронов в каждом слое). Иногда я получал разные предсказания («сети малого размера»), и в большинстве случаев либо одни и те же предсказания или предсказания далеки от реальности. Функция потерь медленно уменьшается (иногда увеличивается, а не стабильно). Я попробую другие функции потери, как вы рекомендовали. – chikhawi9

Смежные вопросы