2017-01-16 3 views
1

"dynamic_rnn"を使用してモデルを作成しています。動的 "zero_state"(推論で失敗する)を使用してdynamic_rnnを作成する方法

モデルがそのように私はこれを達成するために以下のコードを設定している80時間の信号に基づいて、私は、各実行の前に「INITIAL_STATEを」ゼロにしたいされています

state = cell_L1.zero_state(self.BatchSize,Xinputs.dtype) 
outputs, outState = rnn.dynamic_rnn(cell_L1,Xinputs,initial_state=state, dtype=tf.float32) 

これがために素晴らしい作品トレーニングプロセス。問題は、推論に行くと、BatchSize = 1の場合、rnnの "状態"が新しいXinputsの形状と一致しないため、エラーが返されます。ですから、私は、入力バッチサイズに基づいて "self.BatchSize"をハードコードするのではなく、作成する必要があると考えました。私はいろいろなアプローチを試みましたが、どちらも働いていませんでした。バッチサイズに基づいて定数であるので、feed_dictを通して一塊の0を渡すのではないでしょう。

ここに私の試みのいくつかがあります。初期化子が実行時まで呼ばれないことがあります考えて、

state = tf.zeros([Xinputs.get_shape()[0], self.state_size], Xinputs.dtype, name="RnnInitializer") 

.....

state = cell_L1.zero_state(Xinputs.get_shape()[0],Xinputs.dtype) 

別のアプローチを、しかし:彼らはすべて、一般的に、入力サイズはグラフの構築時に不明であるため、失敗しますまだグラフのビルドに失敗しました:

init = lambda shape, dtype: np.zeros(*shape) 
state = tf.get_variable("state", shape=[Xinputs.get_shape()[0], self.state_size],initializer=init) 

は、この一定の初期状態を動的に作成するか、私はテンソルサービングコードでfeed_dictを通してそれをリセットする必要があります取得する方法はありますか?グラフ内でこれをtf.Variable.assignを使って1回だけ行う賢い方法がありますか?

答えて

2

この問題を解決する方法は、変数がハードコードされないように「batch_size」を取得する方法でした。

これは、与えられた例から正しいアプローチであった:これはテンソルの「形状」を返し、BATCH_SIZE値をとり、「[0])(get_shape」問題はの使用である

Xinputs = tf.placeholder(tf.int32, (None, self.sequence_size, self.num_params), name="input") 
state = cell_L1.zero_state(Xinputs.get_shape()[0],Xinputs.dtype) 

at [0]。ドキュメントは明確ではないようですが、これは一定の値であるように見えます。そのため、推論にグラフを読み込むと、この値はまだハードコードされています(グラフ作成時にのみ評価されるかもしれません)。

"tf.shape()"関数を使用すると、そのトリックを行うようです。これは形状を返さず、テンソルを返します。これは実行時にもっと更新されるようです。このコードの断片を使用すると、128の訓練バッチの問題を解決した後、ここだけで1

Xinputs = tf.placeholder(tf.int32, (None, self.sequence_size, self.num_params), name="input") 
batch_size = tf.shape(Xinputs)[0] 
state = self.cell_L1.zero_state(batch_size,Xinputs.dtype) 

のバッチを扱うTensorFlow-サービス推論にグラフをロードすると、「このアプローチを説明しTensorFlowよくある質問への良いリンクです可変バッチサイズで動作するグラフを作成するにはどうすればよいですか? ': https://www.tensorflow.org/resources/faq

関連する問題