Я пытаюсь сравнить результаты двоичной классификации с использованием логистической регрессии и глубоких нейронных сетей.
Созданный мною набор данных был 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})