tf_num_mask_Bという[B,H,W] サイズのテンソルがあります。channnel*1の画像マスクを想定しています。
tf_num_mask_Bの各セルにはすでに固定値として[0, 1, 2, 3, 10, 11, 12, 13, 14]のどれかが入っています。
このなかのnum = [1,2,3,10,11,12,13,14]の値を持つtf_num_mask_Bのインデックスのところに次の変数updatesの対応した値をいれて更新したい(入れ替えたい)です。
updates = tf.Variable(initial_value=tf.ones([batch_size, 8], dtype=tf.uint8))
です。型はほんとはfloat32がいいです。仮設定です。
対応とは
例えば tf_num_mask_B[0,1,1]の値が2だったらupdates[0,1]を代入したいといった感じです。
一般化するとtf_num_mask_B[b,i,j]の値がXだったらupdates[ b, numsでのXの位置 ]を代入したいといった感じです。
それで以下のコードを書きました。for文はあとで書き変えるかもしれないですが、とりえず挙動の確認のためにこのように書いています。
idxの形は取得されるインデックスの数によって変わり、例えばtf_num_mask_Bで1の値を持つセルが多ければ大きくなります。
python
1 2tf_num_mask_B = ファイル読み込みなどのコード # [B,H,W] tf.uint8 0-14の値 3 4def num_to_variable(tf_num_mask_B): 5 6 nums = [1,2,3,10,11,12,13,14] 7 updates = tf.Variable(initial_value=100 * tf.ones([batch_size, 8], dtype=tf.uint8)) # 確認しやすいように100倍しています。 8 9 # att_mask = tf.Variable(initial_value=tf.zeros_like(tf_num_mask_B.shape, dtype=tf.float32)) ## [b,h,w] 10 11 for b in range(batch_size): 12 for i, num in enumerate(nums): 13 idx = tf.where(tf.equal(tf_num_mask_B[b], num)) #[h,w] 14 15 tf.map_fn(lambda id: (0 * tf_num_mask_B[b, id[0], id[1]] + updates[b][i]), elems=idx) 16 17 # tf.map_fn(lambda id: 0 * tf_num_mask_B[b, id[0], id[1]] + updates[b][i], elems=idx) 18 # print_tensor(tf_num_mask_B[b, idx[0], idx[1]]) 19 # tf_num_mask_B[b, idx[0], idx[1]] * tf.zeros([1]) + updates[b, i] 20 return tf.reduce_max(tf_num_mask_B) 21 22 23init = tf.global_variables_initializer() 24with tf.Session() as sess: 25 sess.run(init) 26 print(sess.run(num_to_variable(tf_num_mask_B)))
それで 特にエラーは出ていないのですが、確認のためにreturn tf.reduce_max(tf_num_mask_B)としてこの配列の最大値を出してみたら14となっていて想定の100になっていないので、きちんとupdateできていなくてどうやってもできません。どなたかどうやったら目的が叶えられるのかご教授お願いします。
回答1件
あなたの回答
tips
プレビュー