ビデオ シーケンスの分類にソフト アテンションを実装しようとしています。NLP には多くの実装と例があるため、このスキーマに従ってみましたが、ビデオ1については. 基本的に、Attention Model を間に挟んだ 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 はありますか?
- これをシーケンス分類に使用することは実際に意味がありますか?