web-dev-qa-db-ja.com

TensorFlowで変数の形状を変更するにはどうすればよいですか?

TensorFlowチュートリアル は、作成時にテンソルの形状を指定する必要があることを示しています。その形状は自動的にテンソルの形状になります。また、TensorFlowは変数を再形成するための高度なメカニズムを提供すると述べています。どうやってやるの?コード例はありますか?

21
Jadiel de Armas

TensorFlowドキュメントの shapes-and-shaping をご覧ください。利用可能なさまざまな形状変換について説明します。

最も一般的な関数はおそらく tf.reshape で、これはnumpyと同等です。要素の数が同じである限り、任意の形状を指定できます。ドキュメントにはいくつかの例があります。

6

tf.Variable クラスは変数を作成するための推奨される方法ですが、作成された変数の形状を変更する能力を制限します。

変数の形状を変更する必要がある場合は、次のことを実行できます(たとえば、32ビット浮動小数点テンソルの場合):

var = tf.Variable(tf.placeholder(tf.float32))
# ...
new_value = ...  # Tensor or numpy array.
change_shape_op = tf.assign(var, new_value, validate_shape=False)
# ...
sess.run(change_shape_op)  # Changes the shape of `var` to new_value's shape.

この機能は文書化されたパブリックAPIにはないため、変更される可能性があることに注意してください。この機能を使用する必要がある場合はお知らせください。今後のサポート方法を調査いたします。

19
mrry

ドキュメントが示しています 再形成の方法。彼らです:

  • 形を変える
  • スクイーズ(サイズ1の次元をテンソルの形状から削除)
  • expand_dims(サイズ1の寸法を追加)

テンソルのshapesizerankを取得するためのメソッドの束。おそらく最も使用されるのはreshapeであり、ここにいくつかのEdgeケース(-1)を含むコード例を示します。

import tensorflow as tf

v1 = tf.Variable([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
])
v2 = tf.reshape(v1, [2, 6])
v3 = tf.reshape(v1, [2, 2, -1])
v4 = tf.reshape(v1, [-1])
# v5 = tf.reshape(v1, [2, 4, -1]) will fail, because you can not find such an integer for -1
v6 = tf.reshape(v1, [1, 4, 1, 3, 1])
v6_shape = tf.shape(v6)
v6_squeezed = tf.squeeze(v6)
v6_squeezed_shape = tf.shape(v6_squeezed)

init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)
a, b, c, d, e, f, g = sess.run([v2, v3, v4, v6, v6_shape, v6_squeezed, v6_squeezed_shape])
# print all variables to see what is there
print e # shape of v6
print g # shape of v6_squeezed
4
Salvador Dali
tf.Variable(tf.placeholder(tf.float32))

テンソルフロー1.2.1では無効です

in python Shell:

import tensorflow as tf
tf.Variable(tf.placeholder(tf.float32))

あなたが取得します:

ValueError: initial_value must have a shape specified: Tensor("Placeholder:0", dtype=float32)

更新:validate_shape=Falseを追加しても、エラーは発生しません。

tf.Variable(tf.placeholder(tf.float32), validate_shape=False)

tf.py_funcが要件に一致する場合:

def init():
    return numpy.random.Rand(2,3)
a = tf.pyfun(init, [], tf.float32)

独自の初期化関数を渡すことにより、任意の形状の変数を作成できます。

別の方法:

var = tf.get_varible('my-name', initializer=init, shape=(1,1))

tf.constantまたはnumpy配列を返すinit関数を渡すことができます。提供された形状は検証されません。出力形状は実際のデータ形状です。

2
chunyang.wen