2017-07-21 12 views
2

私は中国のシーンのテキスト認識を行うために(https://arxiv.org/pdf/1507.05717.pdfに基づいて)cnn + lstm + ctcネットワークを使用しています。多数のクラス(3500+)の場合、ネットワークは鍛えるのが非常に難しいです。グループLSTM(https://arxiv.org/abs/1703.10722、O. KuchaievとB. Ginsburg、「LSTMネットワークのファクタリゼーショントリック」、ICLR 2017ワークショップ)を使用すると、パラメータの数を減らしてトレーニングを加速することができると聞いたので、私はコード。テンソルフローの双方向rnnを作成するためにglstm(グループLSTM)セルを使用してください

2層双方向のlstmを使用します。これはtf.contrib.rnn.LSTMCellを使用した元のコードです

rnn_outputs, _, _ = 
tf.contrib.rnn.stack_bidirectional_dynamic_rnn(
[tf.contrib.rnn.LSTMCell(num_units=self.num_hidden, state_is_tuple=True) for _ in range(self.num_layers)], 
[tf.contrib.rnn.LSTMCell(num_units=self.num_hidden, state_is_tuple=True) for _ in range(self.num_layers)], 
self.rnn_inputs, dtype=tf.float32, sequence_length=self.rnn_seq_len, scope='BDDLSTM') 

トレーニングは非常に遅いです。 100時間後、試験セットの予測値は依然として39%である。

今、私はtf.contrib.rnn.GLSTMCellを使用します。私は

rnn_outputs, _, _ = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(
[tf.contrib.rnn.GLSTMCell(num_units=self.num_hidden, num_proj=self.num_proj, number_of_groups=4) for _ in range(self.num_layers)], 
[tf.contrib.rnn.GLSTMCell(num_units=self.num_hidden, num_proj=self.num_proj, number_of_groups=4) for _ in range(self.num_layers)], 
self.rnn_inputs, dtype=tf.float32, sequence_length=self.rnn_seq_len, scope='BDDLSTM') 

のように、このGLSTMCellでLSTMCellを交換するとき、私はGLSTMCellは、単に(tf.contrib.rnn.stack_bidirectional_dynamic_rnnでLSTMCellを置き換えることができるかどうかわからないんだけど、次のエラー

/home/frisasz/miniconda2/envs/dl/bin/python "/media/frisasz/DATA/FSZ_Work/deep learning/IDOCR_/work/train.py" 
Traceback (most recent call last): 
    File "/media/frisasz/DATA/FSZ_Work/deep learning/IDOCR_/work/train.py", line 171, in <module> 
    train(train_dir='/media/frisasz/Windows/40T/', val_dir='../../0000/40V/') 
    File "/media/frisasz/DATA/FSZ_Work/deep learning/IDOCR_/work/train.py", line 41, in train 
    FLAGS.momentum) 
    File "/media/frisasz/DATA/FSZ_Work/deep learning/IDOCR_/work/model.py", line 61, in __init__ 
    self.logits = self.rnn_net() 
    File "/media/frisasz/DATA/FSZ_Work/deep learning/IDOCR_/work/model.py", line 278, in rnn_net 
    self.rnn_inputs, dtype=tf.float32, sequence_length=self.rnn_seq_len, scope='BDDLSTM') 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/rnn.py", line 220, in stack_bidirectional_dynamic_rnn 
    dtype=dtype) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn.py", line 375, in bidirectional_dynamic_rnn 
    time_major=time_major, scope=fw_scope) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn.py", line 574, in dynamic_rnn 
    dtype=dtype) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn.py", line 737, in _dynamic_rnn_loop 
    swap_memory=swap_memory) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2770, in while_loop 
    result = context.BuildLoop(cond, body, loop_vars, shape_invariants) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2599, in BuildLoop 
    pred, body, original_loop_vars, loop_vars, shape_invariants) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2549, in _BuildLoop 
    body_result = body(*packed_vars_for_body) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn.py", line 720, in _time_step 
    skip_conditionals=True) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn.py", line 206, in _rnn_step 
    new_output, new_state = call_cell() 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn.py", line 708, in <lambda> 
    call_cell = lambda: cell(input_t, state) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn_cell_impl.py", line 180, in __call__ 
    return super(RNNCell, self).__call__(inputs, state) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/layers/base.py", line 441, in __call__ 
    outputs = self.call(inputs, *args, **kwargs) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/rnn_cell.py", line 2054, in call 
    R_k = _linear(x_g_id, 4 * self._group_shape[1], bias=False) 
    File "/home/frisasz/miniconda2/envs/dl/lib/python2.7/site-packages/tensorflow/python/ops/rnn_cell_impl.py", line 1005, in _linear 
    "but saw %s" % (shape, shape[1])) 
ValueError: linear expects shape[1] to be provided for shape (?, ?), but saw ? 

Process finished with exit code 1 

を取得します)(またはrnnを構築するのに役立つ他の関数)。私はGLSTMCellの使用の例は見つけませんでした。誰もGLSTMCellで双方向のrnnを構築する正しい方法を知っていますか?

答えて

0

bidirectional_dynamic_rnnを使用して双方向GLSTMを構築しようとしたときと全く同じエラーが発生しました。

私の場合、GLSTMは静的な方法で定義されている場合にのみ使用できます。グラフが計算されるとき、形状パラメータ(例:batch_sizeなど)を持つことはできません。

したがって、GLSTMセルのある時点で終了するすべてのシェイプをグラフに定義してください。正常に動作するはずです。

+0

ありがとうございました。私はglstmを使用しないことに決めました。私は別の方法でトレーニングをスピードアップしました。 –

関連する問題