Translate

2017年1月18日水曜日

TensorFlow の tf.strided_slice() を調べる

TensorFlow の チュートリアル RNN サンプルである ptb_word_lm.py を動かしてみたのだけど、

TypeError: strided_slice() missing 1 required positional argument: 'strides'

というエラーメッセージが表示され動作しない..

で、調べてみると..

strided_slice() missing 1 required positional argument: 'strides' #752

で読む限り、どうも tensorFlow 0.12になってから stride_slice()の引数strideを指定しないと動かないらしい..

ほかにも、困ってる人がいるみたい..

tensorflow0.12でcifar10を動かす時のエラー

CIFARのサンプルにも影響でてるのか..

tf.slided_slice() は多次元テンソルデータを矩形(?)に切り出す関数らしく、
下手にstrideを指定すると間違えるおそれがある..

ということで、TensorFlowの tf.stlide_slice()のドキュメントを勝手訳してみた。
----
tf.strided_slice(input_, begin, end, strides=None, begin_mask=0, end_mask=0, ellipsis_mask=0, new_axis_mask=0, shrink_axis_mask=0, var=None, name=None) {#strided_slice}


テンソルから、ストライドされたスライスを抽出します。

最初の順番では、この操作はテンソル `input` の `begin` から始まる位置から、サイズ `end - begin` のスライスを抽出します。スライス抽出は、すべての次元が `end`より小さくなるまで、` begin`インデックスに `stride` を追加することによって継続されます。ストライドのコンポーネントは負の値にすることができ、これは逆のスライスを引き起こすことに注意してください。

この操作は、numpyスタイルのスライスされた範囲のエンコーディングと考えることができます。Pythonスライス input[、...、] が与えられた場合、この関数は次のように呼び出されます。

`begin`、` end`、 `strides`はすべて長さ n になります。 n は一般に `input`と同じ次元ではありません。

i番目の仕様では、 `begin_mask`、` end_mask`、`ellipsis_mask`、` new_axis_mask`、`shrink_axis_mask`は、i番目の仕様に対応するi番目のビットを持ちます。

`begin_mask`のi番目のビットがゼロでない場合、` begin [i] `は無視され、そのディメンション内の可能な最大範囲が代わりに使用されます。
`end_mask`は、終了範囲を除いて同様に機能します。

7 x 8 x 9 型テンソルの `foo [5:、:、::3]`は `foo [5:7,0:8,0:3]`と同じです。
`foo [:: - 1]`は8のテンソルを逆転させます。

`ellipsis_mask`のi番目のビットが必要ならば、指定されていない次元数だけ他の次元の間に挿入されます。 `ellipsis_mask`には1つの非ゼロビットだけが許されます。

たとえば、 10 x 3 x 3 x 10 型テンソルの形の `foo [3:5, ...,4:5]``foo [3:5, :, :4:5]`と `foo [3:5, ...] `は` foo [3:5, :, :, :]]` と等価です。

`new_axis_mask`のi番目のビットが 1 の場合、` begin`、 `end`、` stride`は無視され、出力テンソルのこの時点で新しい長さ 1 次元が追加されます。

たとえば、 10 x 8 型テンソルの `foo [3:5,4]` は 2 型テンソルの形状を生成し、 `foo [3:5,4:5]` は `shrink_mask` が `1 << 1 == 2` の 2 x 1 型テンソルを生成します。

`shrink_axis_mask`のi番目のビットが 1 ならば、適切な次元でスライスを実行するために `begin` 、 `end [i]` 、 `stride [i]` が使われますが、出力テンソルは次元が 1 つ小さくなります。 これは、slice [i]i番目のエントリ== 1の場合にのみ有効です。


注: `begin`と` end` はゼロインデックス化されています。 `strides`エントリはゼロでなければなりません。


```python
# 'input' は [[[1, 1, 1], [2, 2, 2]],
#             [[3, 3, 3], [4, 4, 4]],
#             [[5, 5, 5], [6, 6, 6]]]
tf.strided_slice(input, [1, 0, 0], [2, 1, 3], [1, 1, 1]) ==> [[[3, 3, 3]]]
tf.strided_slice(input, [1, 0, 0], [2, 2, 3], [1, 1, 1]) ==> [[[3, 3, 3],
                                                               [4, 4, 4]]]
tf.strided_slice(input, [1, 1, 0], [2, -1, 3], [1, -1, 1]) ==>[[[4, 4, 4],
                                                                [3, 3, 3]]]

引数:



*  `input_`: `Tensor`.
*  `begin`: `int32` もしくは `int64` の `Tensor` 。
*  `end`:  `int32` もしくは `int64` の `Tensor` 。
*  `strides`: `int32` もしくは `int64` の `Tensor` 。
*  `begin_mask`: `int32` のマスク値。
*  `end_mask`: An `int32` のマスク値。
*  `ellipsis_mask`: `int32` のマスク値。
*  `new_axis_mask`: `int32` のマスク値。
*  `_masshrink_axisk`: `int32` のマスク値。
*  `var`: `input_` に関連する変数、もしくは None
*  `name`: operation (操作)名 (オプション)。


戻り値:


 `input`と同じ型の `Tensor` 。

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...