私は478 x 717 x 3 = 1028178ピクセルの画像で、ランクは1です。tf.shapeとtf.rankを呼び出して確認しました。
image.set_shape([478、717、3])を呼び出すと、次のエラーがスローされます。
"Shapes %s and %s must have the same rank" % (self, other))
ValueError: Shapes (?,) and (478, 717, 3) must have the same rank
最初に1028178にキャストして再度テストしましたが、まだエラーが残っています。
ValueError: Shapes (1028178,) and (478, 717, 3) must have the same rank
1つはランク1、もう1つはランク3なので、これは理にかなっています。しかし、ピクセルの総数がまだ一致しているため、エラーをスローする必要があるのはなぜですか。
もちろんtf.reshapeを使用することもできますが、それは機能しますが、それは最適ではないと思います。
TensorFlow FAQで述べたように
x.set_shape()とx = tf.reshape(x)の違いは何ですか?
tf.Tensor.set_shape()メソッドはTensorオブジェクトの静的形状を更新します。これは通常、これを直接推論できない場合に追加の形状情報を提供するために使用されます。テンソルの動的形状は変更されません。
tf.reshape()オペレーションは、動的形状が異なる新しいテンソルを作成します。
新しいテンソルの作成にはメモリの割り当てが含まれるため、トレーニングの例が増えると、コストが高くなる可能性があります。これは設計によるものですか、ここで何か不足していますか?
私が知る限り(そして私はそのコードを記述しました)、にバグはありませんTensor.set_shape()
。誤解は、そのメソッドの紛らわしい名前に起因すると思います。
引用したFAQエントリを詳しく説明すると、Tensor.set_shape()
は、特定のオブジェクトの形状情報を改善する純粋なPython関数ですtf.Tensor
。「改善する」とは、「より具体的にする」という意味です。
したがって、shapeのTensor
オブジェクトがある場合、それは長さが不明な1次元のテンソルです。あなたは電話をかけることができ、電話をかけると形ができます。これは、基礎となるストレージ、または実際にはバックエンドの何にも影響しません。それは、使用する後続の形状推論が、長さ1028178のベクトルであるというアサーションに依存できることを単に意味します。t
(?,)
t.set_shape((1028178,))
t
(1028178,)
t.get_shape()
t
場合はt
形状をしている(?,)
、の呼び出しがt.set_shape((478, 717, 3))
TensorFlowは、すでにそれは知っているので、失敗するt
ことはので、ベクトルであることができない形状を有しています(478, 717, 3)
。の内容からその形状で新しいTensorを作成したい場合はt
、を使用できますreshaped_t = tf.reshape(t, (478, 717, 3))
。これにより、tf.Tensor
Pythonで新しいオブジェクトが作成されます。の実際の実装でtf.reshape()
は、テンソルバッファの浅いコピーを使用してこれを行うため、実際には安価です。
1つの例えは、Tensor.set_shape()
Javaのようなオブジェクト指向言語でのランタイムキャストのようなものです。たとえば、ポインタへのポインタObject
があっても、それが実際にはであることがわかっているString
場合は、引数(String) obj
を必要obj
とするメソッドに渡すためにキャストを実行できString
ます。ただし、String
s
aがありjava.util.Vector
、それをにキャストしようとすると、これら2つのタイプは無関係であるため、コンパイラーはエラーを出します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加