簡體   English   中英

如何在張量流中使用指定的掩碼平均張量軸

[英]how to average a tensor axis with specified mask in tensorflow

例如:

我有一個輸入tensor(input) ,形狀為(?,10) dtype=float32 ,第一個維度表示batch_size

還有一個掩碼tensor(mask) ,形狀為(?,10) mask[sample_number]就像[True,True,False,...] ,表示掩碼

和標簽張量(avg_label),形狀(?,) ,意味着每個樣本的掩碼位置的正確平均值

我想訓練模型,但找不到獲得輸出的好方法。

tf.reduce_... (例如tf.reduce_mean )函數似乎不支持關於屏蔽的論點。

我嘗試tf.boolean_mask ,但它會將輸出形狀扁平化為一維,拋出 sample_number 維,因此無法區分樣本

我考慮過tf.where ,比如:

masked=tf.where(mask,input,tf.zeros(tf.shape(input)))
avg_out=tf.reduce_mean(masked,axis=1)
loss=tf.pow(avg_out-avg_label,2)

但是上面的代碼肯定不起作用,因為 False 設置為 0 會改變 avg。 如果使用 np.nan ,它總是會得到 nan 。 我想知道在做reduce操作時是否有一個表示缺席的值。

我該怎么做?

您可以使用tf.ragged.boolean_mask來保持維度。

tf.reduce_mean(tf.ragged.boolean_mask(x, mask=mask), axis=1)

您可以通過計算掩碼中的非消失條目來編寫自己的均值函數

為什么不只是

import tensorflow as tf
import numpy as np

B, H, W, C = 5, 224, 224, 3

data = np.random.randn(B, H, W, C).astype(np.float32)
mask = np.random.randint(2, size=(B, H, W, C)).astype(np.float32)

expected = (data * mask).sum(axis=(1, 2, 3), keepdims=True)
expected = expected / mask.sum(axis=(1, 2, 3), keepdims=True)

data_op = tf.convert_to_tensor(data)
mask_op = tf.convert_to_tensor(mask)

actual_op = tf.reduce_sum(tf.multiply(data, mask), axis=[1, 2, 3], keepdims=True) / tf.reduce_sum(mask, axis=[1, 2, 3], keepdims=True)

with tf.Session() as sess:
    actual = sess.run(actual_op)

np.testing.assert_allclose(actual, expected)

您可以使用tf.boolean_mask

In [17]: tensor = tf.constant([[1, 2], [3, 4], [5, 6]])
In [18]: mask = np.array([[True, False], [False, True], [True, False]])
In [19]: masked = tf.boolean_mask(tensor, mask)
In [20]: masked.eval()
Out[20]: array([1, 4, 5], dtype=int32)
In [21]: tf.reduce_mean(masked).eval()
Out[21]: 3

對於 False 掩碼值,您可以使用 tf.logical_not 切換掩碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM