我正在尝试对视频序列分类实施软注意。由于有很多关于 NLP 的实现和示例,所以我尝试遵循这个模式,但对于 video 1。基本上是一个中间有注意力模型的 LSTM。
1 https://blog.heuritech.com/2016/01/20/attention-mechanism/
我的注意力层代码如下,我不确定它是否正确实现。
def attention_layer(self, input, context):
# Input is a Tensor: [batch_size, lstm_units]
# Input (Seq_length, batch_size, lstm_units)
# Context is a LSTMStateTuple: [batch_size, lstm_units]. Hidden_state, output = StateTuple
hidden_state, _ = context
weights_y = tf.get_variable("att_weights_Y", [self.lstm_units, self.lstm_units], initializer=tf.contrib.layers.xavier_initializer())
weights_c = tf.get_variable("att_weights_c", [self.lstm_units, self.lstm_units], initializer=tf.contrib.layers.xavier_initializer())
z_ = []
for feat in input:
# Equation => M = tanh(Wc c + Wy y)
Wcc = tf.matmul(hidden_state, weights_c)
Wyy = tf.matmul(feat, weights_y)
m = tf.add(Wcc, Wyy)
m = tf.tanh(m, name='M_matrix')
# Equation => s = softmax(m)
s = tf.nn.softmax(m, name='softmax_att')
z = tf.multiply(feat, s)
z_.append(z)
out = tf.stack(z_, axis=1)
out = tf.reduce_sum(out, 1)
return out, s
因此,在我的 LSTM 之间(或在我的 2 个 LSTM 开始时)添加这一层会使训练变得如此缓慢。更具体地说,声明优化器需要很长时间:
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)
我的问题是:
- 实施是否正确?如果是,有没有办法对其进行优化以使其正确训练?
- 我无法使其与 seq2seq API 一起工作。是否有任何带有 Tensorflow 的 API 可以让我解决这个特定问题?
- 将它用于序列分类真的有意义吗?