Точность теста Tensorflow LSTM не сдвинется с места

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

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

0 ответов

Другие вопросы по тегам