У меня были проблемы с 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