オペレーターが実際に何をするのか知りたいですtf.strided_slice()
。
ドキュメント言う、
まず、この操作は、begin で指定された位置から始まるテンソル入力から、サイズ end - begin のスライスを抽出します。スライスは、すべての次元が end 未満でなくなるまで、stride を begin インデックスに追加して続行されます。stride のコンポーネントは負になる可能性があり、その場合、逆スライスが発生することに注意してください。
そしてサンプルでは、
# 'input' is [[[1, 1, 1], [2, 2, 2]],
# [[3, 3, 3], [4, 4, 4]],
# [[5, 5, 5], [6, 6, 6]]]
tf.slice(input, [1, 0, 0], [2, 1, 3], [1, 1, 1]) ==> [[[3, 3, 3]]]
tf.slice(input, [1, 0, 0], [2, 2, 3], [1, 1, 1]) ==> [[[3, 3, 3],
[4, 4, 4]]]
tf.slice(input, [1, 1, 0], [2, -1, 3], [1, -1, 1]) ==>[[[4, 4, 4],
[3, 3, 3]]]
私がこのドキュメントを理解している限りでは、最初のサンプル(tf.slice(input, begin=[1, 0, 0], end=[2, 1, 3], strides=[1, 1, 1])
)は、
- 結果のサイズは です
end - begin = [1, 1, 3]
。サンプルの結果は[[[3, 3, 3,]]]
、形状は であり[1, 1, 3]
、問題ないようです。 - 結果の最初の要素は です
begin = [1, 0, 0]
。サンプル結果の最初の要素は3
、つまり なのでinput[1,0,0]
、問題ないようです。 - スライスは、開始インデックスに stride を追加して続行されます。したがって、結果の 2 番目の要素は になるはずです
input[begin + strides] = input[2, 1, 1] = 6
が、サンプルでは 2 番目の要素が であることが示されています3
。
何strided_slice()
をするのですか?
ベストアンサー1
私はこの方法を少し実験してみましたが、いくつかの洞察が得られました。これは役に立つと思います。テンソルがあるとします。
a = np.array([[[1, 1.2, 1.3], [2, 2.2, 2.3], [7, 7.2, 7.3]],
[[3, 3.2, 3.3], [4, 4.2, 4.3], [8, 8.2, 8.3]],
[[5, 5.2, 5.3], [6, 6.2, 6.3], [9, 9.2, 9.3]]])
# a.shape = (3, 3, 3)
strided_slice()
には4 つの必須引数が必要で、引数としてinput_, begin, end, strides
指定します。 メソッドの場合と同様に、引数は 0 ベースで、残りの引数はシェイプ ベースです。a
input_
tf.slice()
begin
しかし、ドキュメントでbegin
はend
両方ともゼロベースです。
メソッドの機能は非常にシンプルです。
ループを反復処理するように動作します。 はbegin
ループが開始されるテンソル内の要素の位置で、end
はループが停止する場所です。
tf.strided_slice(a, [0, 0, 0], [3, 3, 3], [1, 1, 1])
# output = the tensor itself
tf.strided_slice(a, [0, 0, 0], [3, 3, 3], [2, 2, 2])
# output = [[[ 1. 1.3]
# [ 7. 7.3]]
# [[ 5. 5.3]
# [ 9. 9.3]]]
strides
ループが繰り返されるステップのようなもので、ここでは、[2,2,2]
makes メソッドはテンソル内の (0,0,0)、(0,0,2)、(0,2,0)、(0,2,2)、(2,0,0)、(2,0,2) ..... から始まる値を生成a
します。
tf.strided_slice(input3, [1, 1, 0], [2, -1, 3], [1, 1, 1])
tf.strided_slice(input3, [1, 1, 0], [2, 2, 3], [1, 1, 1])
テンソルa
が であるため、に似た出力が生成されますshape = (3,3,3)
。