2017-05-30 43 views
3

私は人間の行動分類(RNNの1つの軸上のジョイントと他の軸のジョイント)のコンテキストで2D RNNを実装しようとしており、Tensorflow仕事をしなさい。Tensorflowの多次元RNN

は私がGridLSTMCellのことを聞いた(internallyexternallyが貢献)が、それはdynamic_rnnで動作させることができなかった(3-Dテンソルを受け付けますが、私は4-Dテンソル[バッチサイズ、MAX_TIME、num_jointsを提供する必要があるだろう、 n_features])。

また、基本的に通常の1-D LSTMを使用し、それを第2の1-D LSTMに供給するために出力を転置するTFライブラリのpartもある(未知)partです。これはまたhereと提唱されましたが、それが正しいかどうかはあまり確かではありません。もし私が必要とするのと同じ考えがあれば。

ご協力いただければ幸いです。

答えて

0

テンソルフローでGridLSTMndlstmを使用してみました。

私はそれがdynamic_rnnによって受け入れられるための3D一つに4Dテンソルを変換する方法についてはよく分からないが、私は、これはあなたにGridLSTMを使用する方法のアイデアを与えるかもしれないと思う:

def reshape_to_rnn_dims(tensor, num_time_steps): 
    return tf.unstack(tensor, num_time_steps, 1) 


class GridLSTMCellTest(tf.test.TestCase): 
    def setUp(self): 
     self.num_features = 1 
     self.time_steps = 1 
     self.batch_size = 1 
     tf.reset_default_graph() 
     self.input_layer = tf.placeholder(tf.float32, [self.batch_size, self.time_steps, self.num_features]) 
     self.cell = grid_rnn.Grid1LSTMCell(num_units=8) 

    def test_simple_grid_rnn(self): 
     self.input_layer = reshape_to_rnn_dims(self.input_layer, self.time_steps) 
     tf.nn.static_rnn(self.cell, self.input_layer, dtype=tf.float32) 

    def test_dynamic_grid_rnn(self): 
     tf.nn.dynamic_rnn(self.cell, self.input_layer, dtype=tf.float32) 


class BidirectionalGridRNNCellTest(tf.test.TestCase): 
    def setUp(self): 
     self.num_features = 1 
     self.time_steps = 1 
     self.batch_size = 1 
     tf.reset_default_graph() 
     self.input_layer = tf.placeholder(tf.float32, [self.batch_size, self.time_steps, self.num_features]) 
     self.cell_fw = grid_rnn.Grid1LSTMCell(num_units=8) 
     self.cell_bw = grid_rnn.Grid1LSTMCell(num_units=8) 

    def test_simple_bidirectional_grid_rnn(self): 
     self.input_layer = reshape_to_rnn_dims(self.input_layer, self.time_steps) 
     tf.nn.static_bidirectional_rnn(self.cell_fw, self.cell_fw, self.input_layer, dtype=tf.float32) 

    def test_bidirectional_dynamic_grid_rnn(self): 
     tf.nn.bidirectional_dynamic_rnn(self.cell_fw, self.cell_bw, self.input_layer, dtype=tf.float32) 

if __name__ == '__main__': 
    tf.test.main() 

class MultidimensionalRNNTest(tf.test.TestCase): 
    def setUp(self): 
     self.num_classes = 26 
     self.num_features = 32 
     self.time_steps = 64 
     self.batch_size = 1 # Can't be dynamic, apparently. 
     self.num_channels = 1 
     self.num_filters = 16 
     self.input_layer = tf.placeholder(tf.float32, [self.batch_size, self.time_steps, self.num_features, self.num_channels]) 
     self.labels = tf.sparse_placeholder(tf.int32) 

    def test_simple_mdrnn(self): 
     net = lstm2d.separable_lstm(self.input_layer, self.num_filters) 

    def test_image_to_sequence(self): 
     net = lstm2d.separable_lstm(self.input_layer, self.num_filters) 
     net = lstm2d.images_to_sequence(net) 

    def test_convert_to_ctc_dims(self): 
     net = lstm2d.separable_lstm(self.input_layer, self.num_filters) 
     net = lstm2d.images_to_sequence(net) 

     net = tf.reshape(inputs, [-1, self.num_filters]) 

     W = tf.Variable(tf.truncated_normal([self.num_filters, 
            self.num_classes], 
            stddev=0.1, dtype=tf.float32), name='W') 
     b = tf.Variable(tf.constant(0., dtype=tf.float32, shape=[self.num_classes], name='b')) 

     net = tf.matmul(net, W) + b 
     net = tf.reshape(net, [self.batch_size, -1, self.num_classes]) 

     net = tf.transpose(net, (1, 0, 2)) 

     loss = tf.nn.ctc_loss(inputs=net, labels=self.labels, sequence_length=[2]) 

    print(net) 


if __name__ == '__main__': 
    tf.test.main() 
:どうやら、 ndlstm sが形状 (batch_size, height, width, depth)と4Dテンソルを受け入れ、私はこれらのテストを持っている(。tensorflowの ctc_lossの使用を含む1もconv2dでの使用の exampleを見つけました)