Тензорный поток: бинарная классификация приводит к нулю или единице (сеть не обучается сама) - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь сравнить результаты двоичной классификации с использованием логистической регрессии и глубоких нейронных сетей.

Созданный мною набор данных был 1. нормализован, 2. разложен по сингулярным значениям, 3. и первые несколько векторовU матрица из SVD наконец выбрана.

Результаты логистической регрессии выглядели просто отлично.(точность составляет более 80% при использовании 10 векторов из шага 3)

Теперь я попытался запустить Deep нейронную сеть, используя R-тензор потока, и результаты показывают классификацию «все ноль» или «все-один», что означает, чтосеть вообще не обучается.

Я использовал разные оптимизаторы, такие как AdamOptimizer, GradientDescentOptimizer, и различные функции активации, такие как softmax, ReLu, sigmoid.

Я пытался изменитьразмер набора обучающих данных (42941 x 20, 30, 40, ..., 180), количество узлов в скрытом слое (4, 8, 16, ..., 1024) и скорость обучения (1e-2, 1e-3, ..., 1e-10).

Все результаты равны либо 0,491124, либо 0,508876, что является точным соотношением нулей или единиц в моем наборе данных обучения.(Я вручную выбрал количество строк, чтобы избежать перекосов классов, как показано ниже; [c (1: 5193,10255: 21575,29877: 32909),]).

Есть ли ошибка в моем коде?Или какие-либо предложения?

Заранее спасибо.

Мой код R-тензорного потока выглядит следующим образом.

(извините за использование R-Tensorflow, а не Python)

(вы можете игнорировать для цикла)

library(tensorflow)

n<-9

for (j in 2:(2*n)) {
  for (k in 1:n) {
    for (m in 1:n) {
      b_dl<-as.matrix(b_11_16_pca$u[c(1:nrow(b_11_15_234_z)),1:(j*10)])
      b_test_dl<-as.matrix(b_11_16_pca$u[c((nrow(b_11_15_234_z)+1):nrow(b_11_16_234_z)),1:(j*10)])

      sess <- tf$InteractiveSession()

      features = tf$placeholder(tf$float32, shape(NULL, as.integer(j*10)))
      labels = tf$placeholder(tf$float32, shape(NULL, 2L))
      keep_prob = tf$placeholder(tf$float32)

      # Layers
      w2 = tf$Variable(tf$random_normal(shape(as.integer(j*10), as.integer(2^(1+k)))))
      b2 = tf$Variable(tf$random_normal(shape(as.integer(2^(1+k)))))
      z2 = tf$add(tf$matmul(features, w2), b2)
      h2 = tf$nn$relu(z2)

      w1 = tf$Variable(tf$random_normal(shape(as.integer(2^(1+k)), as.integer(2^(1+k)))))
      b1 = tf$Variable(tf$random_normal(shape(as.integer(2^(1+k)))))
      z1 = tf$add(tf$matmul(h2, w1), b1)
      h1 = tf$nn$relu(z1)

      w0 = tf$Variable(tf$random_normal(shape(as.integer(2^(1+k)), 2L)))
      b0 = tf$Variable(tf$random_normal(shape(2L)))
      logits = tf$add(tf$matmul(h1, w0), b0)
      y_pred = tf$nn$relu(logits)


      cost = tf$reduce_mean(-tf$reduce_sum(y_pred * tf$log(logits), reduction_indices=1L))
      optimizer = tf$train$AdamOptimizer(1/10^m)$minimize(cost)

      predict = tf$argmax(y_pred, 1L)
      correct_prediction = tf$equal(predict, tf$argmax(labels, 1L))
      accuracy = tf$reduce_mean(tf$cast(correct_prediction, tf$float32))

      sess$run(tf$global_variables_initializer())

      for (i in 1:10000) {
        if (i %% 100 == 0) {
          train_accuracy <- accuracy$eval(feed_dict = dict(
            features = b_dl[c(1:5193,10255:21575,29877:32909),], labels = a_y[c(1:5193,10255:21575,29877:32909),], keep_prob = 1.0))
          cat(sprintf("step %d, training accuracy %g\n", i, train_accuracy))
        }
        optimizer$run(feed_dict = dict(
          features = b_dl[c(1:5193,10255:21575,29877:32909),], labels = a_y[c(1:5193,10255:21575,29877:32909),], keep_prob = 0.5))
      }
    print(paste0("j is ",j,", k is ",k," and m is ",m))}
  }
}

Код для Tensorflow выглядит следующим образом.

import tensorflow as tf

sess = tf.InteractiveSession()

features = tf.placeholder(tf.float32, [None, 20])
labels = tf.placeholder(tf.float32, [None, 2])
keep_prob = tf.placeholder(tf.float32)

w2 = tf.Variable(tf.random_normal([20, 32]))
b2 = tf.Variable(tf.random_normal([32]))
z2 = tf.add(tf.matmul(features, w2), b2)
h2 = tf.nn.relu(z2)

w1 = tf.Variable(tf.random_normal([32, 32]))
b1 = tf.Variable(tf.random_normal([32]))
z1 = tf.add(tf.matmul(h2, w1), b1)
h1 = tf.nn.relu(z1)

w0 = tf.Variable(tf.random_normal([32, 2]))
b0 = tf.Variable(tf.random_normal([2]))
logits = tf.add(tf.matmul(h1, w0), b0)
y_pred = tf.nn.relu(logits)


cost = tf.reduce_mean(-tf.reduce_sum(labels * tf.log(y_pred), reduction_indices=1))
optimizer = tf.train.AdamOptimizer(1e-2).minimize(cost)

predict = tf.argmax(y_pred, 1)
correct_prediction = tf.equal(predict, tf.argmax(labels, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

sess.run(tf.global_variables_initializer())

for i in range(10000): 
  if i % 100 == 0: 
    train_accuracy = accuracy.eval(feed_dict = {
      features: b_dl, labels: a_y, keep_prob: 1.0})
    print("step %d, training accuracy %g\n", i, train_accuracy)
  optimizer.run(feed_dict = {
    features: b_dl, labels: a_y, keep_prob: 0.5})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...