TensorFlowチュートリアル は、作成時にテンソルの形状を指定する必要があることを示しています。その形状は自動的にテンソルの形状になります。また、TensorFlowは変数を再形成するための高度なメカニズムを提供すると述べています。どうやってやるの?コード例はありますか?
TensorFlowドキュメントの shapes-and-shaping をご覧ください。利用可能なさまざまな形状変換について説明します。
最も一般的な関数はおそらく tf.reshape で、これはnumpyと同等です。要素の数が同じである限り、任意の形状を指定できます。ドキュメントにはいくつかの例があります。
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にはないため、変更される可能性があることに注意してください。この機能を使用する必要がある場合はお知らせください。今後のサポート方法を調査いたします。
ドキュメントが示しています 再形成の方法。彼らです:
テンソルのshape
、size
、rank
を取得するためのメソッドの束。おそらく最も使用されるのは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
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
関数を渡すことができます。提供された形状は検証されません。出力形状は実際のデータ形状です。