#python #tensorflow #deep-learning #many-to-many
#python #тензорный поток #глубокое обучение #многие ко многим
Вопрос:
Я работаю над классификацией изображений временных рядов, где мне нужно выводить классификацию на каждом временном шаге (многие ко многим).
Мой график Tensorflow принимает [Размер пакета, временной шаг, изображение] и реализует глубокий CNN-LSTM, который в настоящее время переходит на распределенный по времени плотный слой перед классификацией.
В моей предыдущей работе я добился большого успеха в привлечении внимания к улучшенным временным зависимостям модели путем взвешивания скрытых состояний временных шагов. Однако я не могу найти никаких реализаций, которые пытаются использовать attention в RNN «многие ко многим».
Я пробовал использовать следующий код, который компилируется и запускается, но работает хуже, чем модель без него. Идея здесь в том, чтобы изучать веса внимания на каждом шаге, чтобы взвешивать каждый второй временной шаг на основе текущего временного шага. У меня 7,8 миллиона обучающих выборок, поэтому я не беспокоюсь, что это переоснащение — фактически это увеличивает ошибку обучения по сравнению с моделью без!
def create_multi_attention(inputs, attention_size, time_major=False):
hidden_size = inputs.shape[2].value
print("Attention In: {}".format(inputs.shape))
w_omegas, b_omegas, u_omegas = [], [], []
for i in range(0, MAX_TIME_STEPS):
w_omegas.append(create_weights([hidden_size, attention_size]))
b_omegas.append(tf.Variable(tf.constant(0.05, shape = [attention_size])))
u_omegas.append(create_weights([attention_size]))
# Trainable parameters
layers_all = []
for i in range(0, MAX_TIME_STEPS):
v = tf.tanh(tf.tensordot(inputs, w_omegas[i], axes=1) b_omegas[i])
vu = tf.tensordot(v, u_omegas[i], axes=1, name='vu')
alphas = tf.nn.softmax(vu, name='alphas')
output = tf.reshape(tf.reduce_sum(inputs * tf.expand_dims(alphas, -1), 1), (-1, 1, hidden_size))
layers_all.append(output)
output = tf.concat(layers_all, axis = 1) #[Batch, Time steps, LSTM output size]
print("Attention Out: {}".format(output.shape))
return output
Хотелось бы получить любой вклад, идеи или замечания к документам! Я думал о том, чтобы попробовать модель внимания seq2seq, но это кажется немного натяжкой.
Ответ №1:
Кажется, что этот код работал нормально. Ошибка была ниже по потоку. Если кто-либо использует этот код для реализации «многие ко многим», обратите внимание, что на обучение потребуется очень много времени, поскольку вы изучаете две дополнительные матрицы веса для каждого временного шага.