Numpyにはこのヘルパー関数 np.empty があり、次のようになります。
エントリを初期化せずに、指定された形状とタイプの新しい配列を返します。
tf.concat を使用してテンソルを作成したい場合は、非常に便利です。
入力テンソルの次元数は一致する必要があり、軸を除くすべての次元は等しくなければなりません。
したがって、予想される形状の空のテンソルから始めると便利です。テンソルフローでこれを実現する方法はありますか?
[編集]
これが必要な理由の簡単な例
netInput = np.empty([0, 4])
netTarget = np.empty([0, 4])
inputWidth = 2
for step in range(data.shape.as_list()[-2]-frames_width-1):
netInput = tf.concat([netInput, data[0, step:step + frames_width, :]], -2)
target = tf.concat([target, data[0, step + frames_width + 1:step + frames_width + 2, :]], -2)
この例では、netInputまたはnetTargetが初期化されている場合、追加の例をその初期化と連結します。そして、それらを最初の値で初期化するには、ループをハックする必要があります。市長はいません。これを解決するための「テンソルフロー」の方法があるかどうか疑問に思いました。
最も近い方法は、初期化しない変数を作成することです。 tf.global_variables_initializer()
を使用して変数を初期化する場合は、collections=[]
を設定して、初期化中に変数をグローバル変数のリストに入れないようにします。
例えば、
import numpy as np
import tensorflow as tf
x = tf.Variable(np.empty((2, 3), dtype=np.float32), collections=[])
y = tf.Variable(np.empty((2, 3), dtype=np.float32))
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
# y has been initialized with the content of "np.empty"
y.eval()
# x is not initialized, you have to do it yourself later
x.eval()
ここで、np.empty
はx
に提供され、初期化ではなく、その形状とタイプを指定します。
tf.concat
などの操作の場合、実際にはメモリを自分で管理する必要はありません(実際にはできません)。一部のnumpy
関数で許可されているため、出力を事前に割り当てることはできません。 Tensorflowはすでにメモリを管理しており、メモリブロックが検出された場合は、出力にメモリブロックを再利用するなどの巧妙なトリックを実行します。