多对多LSTM,每个步骤都应引起注意

时间:2019-03-19 03:06:03

标签: python tensorflow deep-learning many-to-many

我正在研究时间序列图像分类,我需要在每个时间步长输出分类(很多)。

我的Tensorflow图采用[批量大小,时间步长,图像]并实现了深层的CNN-LSTM,目前该分类在分类之前进入了时间分布的密集层。

在我以前的工作中,我取得了很多成功,通过加权时间步长的隐藏状态,使人们更加关注更好的模型时间依赖性。但是,我找不到在多对多RNN中尝试引起注意的任何实现。

我尝试使用以下代码,该代码可以编译和运行,但比没有该模型的情况要差。这里的想法是学习每个步骤的注意力权重,以基于当前时间步长来对其他时间步长进行加权。我有780万个训练样本,所以我不担心这会过拟合-实际上,与没有训练的模型相比,它会增加训练误差!

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 个答案:

答案 0 :(得分:0)

似乎此代码可以正常工作。错误是下游。如果有人使用此代码来实现多对多关注,请注意,在每个时间步学习两个额外的权重矩阵时,这将花费很长时间进行训练。