2017-02-23 111 views
0

Я застрял слишком долго и нуждаюсь в некоторой помощи (очень новая для тензорного потока и т. Д.). Я модифицировал пример MNIST своим собственным данным, но получаю 100% -ную точность, даже после двух эпох.
My X (подобно MNIST) a [18, 1] -vector и y float32.
переменные:Tensorflow: получить правильную точность NN

n_nodes_hl1 = 100 
n_nodes_hl2 = 100 
n_nodes_hl3 = 50 
x = tf.placeholder(shape=[None, 18], dtype=tf.float32) 
y = tf.placeholder(shape=[None, 1], dtype=tf.float32) 
x_vals_train = np.array([]) 
y_vals_train = np.array([]) 
x_vals_test = np.array([]) 
y_vals_test = np.array([]) 
loss_vec = [] 

моя модель:

def neural_net_model(data): 
    hidden_1_layer = {'weights':tf.Variable(tf.random_normal([18,n_nodes_hl1])), 
        'biases':tf.Variable(tf.random_normal([n_nodes_hl1]))} 
    hidden_2_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl1,n_nodes_hl2])), 
        'biases':tf.Variable(tf.random_normal([n_nodes_hl2]))} 
    hidden_3_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl2,n_nodes_hl3])), 
        'biases':tf.Variable(tf.random_normal([n_nodes_hl3]))} 

    output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl3,1])), 
    'biases':tf.Variable(tf.random_normal([1]))} 

    l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']),hidden_1_layer['biases']) 
    l1 = tf.nn.relu(l1) 
    l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']),hidden_2_layer['biases']) 
    l2 = tf.nn.relu(l2) 
    l3 = tf.add(tf.matmul(l2, hidden_3_layer['weights']),hidden_3_layer['biases']) 
    l3 = tf.nn.relu(l3) 

    output = tf.matmul(l3, output_layer['weights']) + output_layer['biases'] 

    return output 

Сессия:

def train_neural_network(x): 
    prediction = neural_net_model(x) 
    cost = tf.reduce_mean(tf.abs(y - prediction)) 
    optimizer = tf.train.AdamOptimizer(0.01).minimize(cost) 

    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 
     for i in range(10): 
      temp_loss = 0 

      rand_index = np.random.choice(len(x_vals_train), 50) 
      rand_x = x_vals_train[rand_index] 
      rand_y = np.transpose([y_vals_train[rand_index]]) 
      _, temp_loss = sess.run(optimizer, feed_dict={x: rand_x, y: rand_y}) 

      if (i+1)%100==0: 
      print('Generation: ' + str(i+1) + '. Loss = ' + str(temp_loss)) 

     # evaluate accuracy 
     correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y,1)) 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 
     print "accuracy %.5f'" % accuracy.eval(feed_dict={x: x_vals_test, y: np.transpose([y_vals_test])}) 

Вопрос заключается в том primarely, почему я всегда получаю точность 100%, что является очевидно, ложно. Заранее спасибо!

ответ

2

MNIST обычно имеет разогретый кодированный выход. В этом случае correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y,1)) имеет смысл, поскольку tf.argmax преобразует разогретый код в фактический класс, который затем сравнивается tf.equal.

Но в вашем случае, поскольку выходной размер равен 1tf.argmax выходы 0, который является единственным действующим индексом для обоих и, следовательно, они равны и, следовательно, 100% -ная точность.

Вам необходимо переопределить точность, соответствующую вашему делу. Если предположить, что выход представляет собой двоичное значение (как точность, как метрика имеет смысл только для двоичного случая), вы можете использовать следующее:

correct_prediction = tf.equal(tf.round(prediction), y) 

Здесь вы округление prediction, а затем по сравнению с y. Для этой работы вам необходимо иметь сигмовидный как активацию output = tf.nn.sigmoid(output) конечного слой или вам нужно подрезать предсказание:

correct_prediction = tf.equal(tf.round(tf.clip_by_value(prediction,0,1)), y) 

Другого варианта для вас будет конвертировать y_vals_train, y_vals_test к одному докрасна коде и имеют сеть выход 2.

+0

Теперь все выглядит немного яснее :) спасибо. Мой вывод - это float (время выполнения запроса), поэтому, если у вас есть какие-то советы, у меня все уши. Но вы четко ответили на исходный вопрос .. так что я принимаю – dv3

+0

Хорошо среднеквадратичная ошибка - лучшая метрика для реального значения. Вы также можете использовать среднюю абсолютную ошибку, как и в случае потери. – indraforyou