Tensorflow DNN всегда не соответствует моему набору данных

#python #tensorflow #neural-network #deep-learning

#python #tensorflow #нейронная сеть #глубокое обучение

Вопрос:

Я пытаюсь создать глубокую нейронную сеть с низкоуровневым API tensorflow, хотя, когда я обучаю модель и тестирую ее, потери и mae тестового набора и обучающего набора очень похожи и очень высоки по сравнению с другими моделями, которые я пробовал (например, Случайный лес, дерево решений AdaBoost). Я даже создал тот же dnn, используя keras, и это дало мне гораздо лучшие результаты Я не понимаю проблемы, у меня нет большого опыта в машинном обучении

Код Tensorflow

 # load libraries
import tensorflow as tf

# reset graph
tf.reset_default_graph()


# define variables

n_hidden1 = 200
n_outputs = 1


with tf.device("/gpu:0"):
    X = tf.placeholder(tf.float32, shape=(None, n_features), name="X")
    y = tf.placeholder(tf.float32, shape=(None), name="y")

    with tf.name_scope("dnn"):
        hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1",
                                  activation=tf.nn.leaky_relu)
        logits = tf.layers.dense(hidden1, n_outputs, name="logits")

with tf.device("/cpu:0"):
    with tf.name_scope("loss"):
        loss = tf.reduce_mean(tf.abs(logits - y), name="loss")


with tf.device("cpu:0"):
    with tf.name_scope("learning_rate"):
        learning_rate = 0.001

with tf.device("/gpu:0"):
    with tf.name_scope("train"):
        optimizer = tf.train.AdamOptimizer(learning_rate)
        training_op = optimizer.minimize(loss)

with tf.device("/gpu:0"):        
    with tf.name_scope("eval"):
        mae = tf.reduce_mean(tf.abs(logits - y), name="mae")

def shuffle_batch(X, y, batch_size):
    rnd_idx = np.random.permutation(len(X))
    n_batches = len(X) // batch_size
    for batch_idx in np.array_split(rnd_idx, n_batches):
        X_batch, y_batch = X[batch_idx], y[batch_idx]
        yield X_batch, y_batch
n_epochs = 200
batch_size = 1000
n_batches = int(np.ceil(X_train.shape[0] / batch_size))

# create graph variables initializer 
init = tf.global_variables_initializer()

# create model saver
saver = tf.train.Saver()

# set device to gpu
with tf.device("/gpu:0"):
    with tf.Session() as sess:
        sess.run(init)
        for epoch in range(n_epochs):
            print("Epoch:", str(epoch)   "/"   str(n_epochs))
            batch_index = 0
            for X_batch, y_batch in shuffle_batch(X_train, np.array(y_train).reshape(-1), batch_size):
                sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
            acc_batch = mae.eval(feed_dict={X: X_batch, y: y_batch})
            acc_val = mae.eval(feed_dict={X: X_test, y: np.array(y_test).reshape(-1)})
            loss_batch = loss.eval(feed_dict={X: X_batch, y: y_batch})
            loss_val = loss.eval(feed_dict={X: X_test, y:  np.array(y_test).reshape(-1)})
            print("Batch mae:", acc_batch, "Val mae:", acc_val)
            print("Batch loss:", loss_batch, "Val loss:", loss_val)
  

Код Keras

 import tensorflow as tf
from keras import layers
from keras import models
from keras import optimizers
from keras import initializers
from keras import regularizers

network = models.Sequential()

network.add(layers.Dense(units=200, 
                         activation=tf.nn.leaky_relu, 
                         input_shape=(X_train.shape[1], )))

# output layer
network.add(layers.Dense(units=1))

network.compile(loss="mae", 
                optimizer=optimizers.Adam(lr=0.001),
                metrics=["mae"])

history = network.fit(X_train,
                      np.array(y_train).reshape(-1),
                      epochs=200, 
                      verbose=1,
                      batch_size=1000,
                      validation_data=(X_test, np.array(y_test).reshape(-1)),
                      shuffle=True)
  

Комментарии:

1. Является ли mae хорошей функцией потерь для вашей проблемы?

2. На самом деле, я работаю во внешнем проекте, и я вынужден использовать mae в качестве функции потерь @NihalSangeeth