5

入力がタイムメジャーではなくバッチメジャーである場合、RNNは異なる依存パターンを学習しますか?バッチメジャーとタイムメジャーLSTM

+0

具体的な答えはありませんが、文脈依存であり、例えば行列のバッチはバッチメジャー記憶(各マットムは独立しているので)、同じ畳み込みを複数の画像に適用する場合も同様です。画像処理はTensorFlowの主な用途であるため、慣習が最適ではない可能性のある場所に染み込むことはあまり驚くことではありません。 –

+0

静的なLSTMのコンテキストではどうでしょうか。おそらく、バッチ内のタイムステップのアライメントにいくつかの緊急の特性があると思っていましたが、これらもタイム・メジャーな形で発見されると思います。 – ssjadon

+0

私はLSTMが時間の重要性を常に求めていると思っています。なぜなら、LSTMは時間の入力に基づいてスライスされるからです。他の種類のRNNは例外かもしれません.WebNetのようなバッチメジャーが必要な場合もあります。効率の内訳は –

答えて

4

(編集:それはが意味になりますが、私はそれがないことに気づいなぜ申し訳ありません、私の最初の引数がありませんでしたので、これは少しOTである。)

私はTF-グループの推論を発見していませんこれの後ろですが、ではありませんは、opsがC++で書かれているような計算上の意味を持っています。

直感的に、我々は同じタイムステップ上の同じシーケンスから異なる特徴をマッシュアップ(乗算/加算など)したいと思う。バッチ/シーケンスは、バッチ/シーケンス>タイムステップのように機能することができるので、異なるタイムステップを並列に行うことはできません。 default Numpy and C++ uses row-major(C様)メモリレイアウトにより

よう

[[ 0. 1. 2.] 
[ 3. 4. 5.] 
[ 6. 7. 8.]] 

メモリに[0,1,2,3,4,5,6,7,8]ように敷設されています。これは、我々は行優先メモリで

x = np.zeros([time,batch,feature]) 

(tensorflowでtime_major=True

を持っている場合、我々はx[0,0,0],x[0,0,1],x[0,0,2],…,x[0,1,0],...ので、元のようなレイアウトを得ることを意味します。同じシーケンスとタイムステップ(w*x[t,b,:])からの重みとベクトルの内積は、次のシーケンスw*x[t,b+1,:]などに続く最も連続的な操作です。これはトレーニング中に必要なものです。デフォルトはtime_major=False

我々持って、同じ順序が異なるタイムステップからその元の機能はこれが時間の場合に速い一方の配列を予測するかもしれないw*x[batch,t+1,:]などが続いすなわちw*x[batch,t,:]以上連続している[バッチ、時間、機能] RNNは公開されていますが、これは推測です。

私がしたのと同じ理由でこの質問に来た場合、必ずしも行メジャーではなく、少し不気味なナンシーインデックス作成に注意することを学んだ。これを見てください。予想通り:

x = np.zeros([3,3]) 
x[0:9].flat = np.arange(10) 
print x 
> [[ 0. 1. 2.] 
> [ 3. 4. 5.] 
> [ 6. 7. 8.]] 

またx[1] == x[0,1]が、

print x[1] 
> [ 3. 4. 5.] 

print x[np.arange(10)<=4] 
> IndexError: index 3 is out of bounds for axis 0 with size 3 
+0

+1です。私は反復的なネットがバッチメジャー入力で異なる依存パターンを学習するかどうかについての好奇心からこの質問に来た。 – ssjadon

+0

私の答えは完全に無関係だったことがわかりました。申し訳ありません。依存パターン(私はパターンとして解釈する)に関しては、なぜこれが当てはまるのかわかりません。もしそうなら、私はそれをバグに指定します – ragulpr

1

を期待するモデルが学習するものに違いはありません。

タイムステップtでは、RNNはt-1からの結果を必要とするため、タイムメジャーなものを計算する必要があります。 time_major=Falseの場合、TensorFlowは(batch_size, max_sequence_length)から(max_sequence_length, batch_size) *までの配列のバッチを転置します。転置されたバッチを一度に1行ずつ処理します。t = 0では、各シーケンスの最初の要素が処理され、隠れ状態と出力が計算されます。 t = max_sequence_lengthで、各シーケンスの最後の要素が処理されます。

データがすでに時間切れの場合は、転位を避けるtime_major=Trueを使用してください。しかし、TensorFlowに手作業でデータを渡す前に手動でデータを入れ替えることにはあまり意味がありません。

*多次元入力(例:単語埋め込みのシーケンス:(batch_size, max_sequence_length, embedding_size))、軸0と1は転置され、(max_sequence_length, batch_size, embedding_size)