web-dev-qa-db-ja.com

テンソルフロー:テンソルの値を変更する方法

Tensorflowを使用してモデルをトレーニングする前に、データのいくつかの前処理を記述する必要があるため、tensorのいくつかの変更が必要です。ただし、tensorを使用する方法のようにnumpyの値を変更する方法についてはわかりません。

これを行う最善の方法は、tensorを直接変更できることです。しかし、Tensorflowの現在のバージョンでは不可能なようです。別の方法は、プロセスのtensorndarrayに変更し、_tf.convert_to_tensor_を使用して元に戻すことです。

重要なのは、tensorndarrayに変更する方法です。
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と同じになるようにすることです。

[〜#〜]ヒント[〜#〜]
tfcnpcは互いに独立していることに注意してください。これは、最初に取得したトレーニングデータが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]]

11
user3030046

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]]
9
Sung Kim

私はこれにしばらく苦労しました。与えられた答えは、グラフに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})
0
user5931