Tensorflowを使用してモデルをトレーニングする前に、データのいくつかの前処理を記述する必要があるため、tensor
のいくつかの変更が必要です。ただし、tensor
を使用する方法のようにnumpy
の値を変更する方法についてはわかりません。
これを行う最善の方法は、tensor
を直接変更できることです。しかし、Tensorflowの現在のバージョンでは不可能なようです。別の方法は、プロセスのtensor
をndarray
に変更し、_tf.convert_to_tensor
_を使用して元に戻すことです。
重要なのは、tensor
をndarray
に変更する方法です。
1)tf.contrib.util.make_ndarray(tensor)
: https://www.tensorflow.org/versions/r0.8/api_docs/python/contrib.util.html#make_ndarray
これはドキュメントごとに最も簡単な方法のようですが、Tensorflowの現在のバージョンではこの関数を見つけることができません。次に、その入力はTensorProto
ではなくtensor
です。
2)a.eval()
を使用してa
を別のndarray
にコピーします
まだ、ノートブックでtf.InteractiveSession()
を使用する場合にのみ機能します。
コードのある簡単なケースを以下に示します。このコードの目的は、プロセス後のtfc
の出力がnpc
と同じになるようにすることです。
[〜#〜]ヒント[〜#〜]tfc
とnpc
は互いに独立していることに注意してください。これは、最初に取得したトレーニングデータがtensor
形式で tf.placeholder()
であるという状況に対応します。
ソースコード
_import numpy as np
import tensorflow as tf
tf.InteractiveSession()
tfc = tf.constant([[1.,2.],[3.,4.]])
npc = np.array([[1.,2.],[3.,4.]])
row = np.array([[.1,.2]])
print('tfc:\n', tfc.eval())
print('npc:\n', npc)
for i in range(2):
for j in range(2):
npc[i,j] += row[0,j]
print('modified tfc:\n', tfc.eval())
print('modified npc:\n', npc)
_
出力:
tfc:
[[1. 2.]
[3. 4.]]
npc:
[[1. 2.]
[3. 4.]]
修正されたtfc:
[[1. 2.]
[3. 4.]]
修正されたNPC:
[[1.1 2.2]
[3.1 4.2]]
Assignおよびeval(またはsess.run)を使用して、assignを実行します。
import numpy as np
import tensorflow as tf
npc = np.array([[1.,2.],[3.,4.]])
tfc = tf.Variable(npc) # Use variable
row = np.array([[.1,.2]])
with tf.Session() as sess:
tf.initialize_all_variables().run() # need to initialize all variables
print('tfc:\n', tfc.eval())
print('npc:\n', npc)
for i in range(2):
for j in range(2):
npc[i,j] += row[0,j]
tfc.assign(npc).eval() # assign_sub/assign_add is also available.
print('modified tfc:\n', tfc.eval())
print('modified npc:\n', npc)
以下を出力します:
tfc:
[[ 1. 2.]
[ 3. 4.]]
npc:
[[ 1. 2.]
[ 3. 4.]]
modified tfc:
[[ 1.1 2.2]
[ 3.1 4.2]]
modified npc:
[[ 1.1 2.2]
[ 3.1 4.2]]
私はこれにしばらく苦労しました。与えられた答えは、グラフにassign
操作を追加します(したがって、後でチェックポイントを保存する場合、.meta
のサイズを不必要に増やします)。より良い解決策は、tf.keras.backend.set_value
を使用することです。以下を実行することにより、生のテンソルフローでそれをエミュレートできます。
for x, value in Zip(tf.global_variables(), values_npfmt):
if hasattr(x, '_assign_placeholder'):
assign_placeholder = x._assign_placeholder
assign_op = x._assign_op
else:
assign_placeholder = array_ops.placeholder(tf_dtype, shape=value.shape)
assign_op = x.assign(assign_placeholder)
x._assign_placeholder = assign_placeholder
x._assign_op = assign_op
get_session().run(assign_op, feed_dict={assign_placeholder: value})