Точность теста Tensorflow LSTM не сдвинется с места - PullRequest
0 голосов
/ 14 февраля 2019

У меня были проблемы с LSTM в Tensorflow уже несколько недель, и у меня нет идей, как исправить мою ситуацию.

Мои данные - это группа групп текстов.В каждой группе есть 3 текста, и я пытаюсь заставить сеть ранжировать тексты внутри группы, используя мои 14 созданных вручную функций.Есть 14 функций, поэтому форма ввода (размер партии, 3, 14).Выходная форма (размер пакета, 3, 3), где первые 3 представляют 3 текста в группе, а вторые 3 представляют максимальный размер 3 для каждого текста.Я рассматриваю это как проблему классификации, поэтому класс softmax 1 имеет ранг 1 и т. Д.

Моя модель выглядит следующим образом: Уровень 1: двунаправленный lstm, Уровень 2: механизм внимания, Уровень 3: прямой lstm, Уровень4: логиты вывода плотного слоя для softmax.

Я строю эту модель на основе сети внимания, полученной из курсов глубокого обучения Эндрю Нга.

Сеть явно перегружена.Случайный набор гиперпараметров дал точность обучения 100% для небольшого тренировочного набора (партия 300).Точность теста была около 33%, что в этой настройке является случайным шансом.

Вот что я пытался до сих пор исправить:

  • изменение гиперпараметров
  • регуляризация(пробовал и пропадание, и l2)
  • увеличить размер тренировочного пакета до 500
  • объединить мои 14 функций с представлениями word2vec (всего = 114 функций)
  • ограничить сеть дотолько двунаправленный и плотный слои
  • увеличить размер тренировочной партии до 1600 (получение данных занимает много времени, и мне пришлось ждать несколько дней, чтобы получить больше)
  • увеличить размер тренировочной партии до 4500
  • все еще пытаюсь настроить гиперпараметры на пути
  • все еще пытаюсь регулировать на пути

У меня нет фиксированных тренировочных и тестовых наборов.Данные делятся случайным образом для каждого «фиксирующего» раунда.

Распечатка результатов подтверждает цифры точности, и они всегда одинаковы.Точность обучения меняется в зависимости от того, что я делаю (особенно с отсевом), но точность теста всегда зависит от случайности.Как будто сеть никогда не изучает и не случайным образом повторно инициализирует параметры для тестирования, я не знаю.

Предполагалось, что это будет моя отправка на конференцию, и у меня не останется много времени.Не знаю, что делать.Что не так с этой сетью ???Пожалуйста, помогите.

Код сети:

def get_attentions(a1a2, s):
    s_repeated = tf.keras.backend.repeat(s, 3)
    concatenated_with_as = tf.concat([s_repeated, a1a2], axis=2)
    d1 = tf.contrib.layers.fully_connected(inputs = concatenated_with_as, num_outputs = 10, activation_fn = tf.nn.tanh, trainable=True)
    d2 = tf.contrib.layers.fully_connected(inputs = d1, num_outputs = 1, activation_fn = tf.nn.tanh, trainable=True)
    alphas = tf.nn.softmax(d2)
    dotted = tf.multiply(a1a2, alphas)
    context = tf.reduce_sum(dotted, 1)
    return context

def forward_prop(X, s, c, cell1, cell2, cell3, keep):
    cell1 = tf.nn.rnn_cell.DropoutWrapper(cell1, output_keep_prob=keep)
    cell2 = tf.nn.rnn_cell.DropoutWrapper(cell2, output_keep_prob=keep)
    cell3 = tf.nn.rnn_cell.DropoutWrapper(cell3, output_keep_prob=keep)
    logs = []
    a, a_states = tf.nn.bidirectional_dynamic_rnn(cell1, cell2, X, time_major=False, dtype=tf.float32)
    a1a2 = tf.concat([a[0], a[1]], 2)
    for t in range(3):
        context = get_attentions(a1a2, s)
        onelog, state_tuple = cell3(context, state=[s, c])
        s = state_tuple[0]
        c = state_tuple[1]
        logs.append(onelog)
    log_inter = tf.stack(logs, axis=1, name='log_inter')
    logits = tf.contrib.layers.fully_connected(inputs = log_inter, num_outputs = 3, activation_fn = None, trainable=True)
    return logits

Код для обучения:

def model(X_train, Y_train, epochs=epochs, alpha=alpha, num_units=num_units, ns=ns, keep_prob=keep_prob, print_cost = False):
    ops.reset_default_graph()
    costs = []
    features = X_train.shape[-1]
    s0 = np.zeros((X_train.shape[0], ns)).real.astype(np.float32)
    c0 = np.zeros((X_train.shape[0], ns)).real.astype(np.float32)
    s0_test = np.zeros((X_test.shape[0], ns)).real.astype(np.float32)
    c0_test = np.zeros((X_test.shape[0], ns)).real.astype(np.float32)
    X, Y, s ,c, keep = create_placeholders(features, ns)
    cell1, cell2, cell3 = define_cells(num_units)
    logits = forward_prop(X, s, c, cell1, cell2, cell3, keep)
    logits_name = tf.identity(logits, name='logits')
    cost = compute_cost(logits, Y)
    optimizer = tf.train.AdamOptimizer(learning_rate=alpha, beta1=0.9, beta2=0.999, epsilon=1e-8).minimize(cost)
    init = tf.global_variables_initializer()
    saver = tf.train.Saver()
    with tf.Session() as sess:
        sess.run(init)
        for epoch in range(1, epochs+1):
            _, epoch_cost = sess.run([optimizer, cost], feed_dict={X: X_train, Y: Y_train, s: s0, c: c0, keep: keep_prob})
            if print_cost == True:
                print('Cost after epoch', epoch, epoch_cost)
            costs.append(epoch_cost)
        soft = tf.nn.softmax(logits, axis=-1)
        correct_prediction = tf.equal(tf.argmax(soft, axis=-1), tf.argmax(Y, axis=-1))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
        train_accuracy = accuracy.eval({X: X_train, Y: Y_train, s: s0, c: c0, keep: 1.0})
        test_accuracy = accuracy.eval({X: X_test, Y: Y_test, s: s0_test, c: c0_test, keep: 1.0})
        saver.save(sess, '/path_to_model/tf_model')
        data.append((alpha, epochs, num_units, ns, keep_prob, train_accuracy, test_accuracy))
        print('Accuracy: ', train_accuracy, test_accuracy)
    return costs
...