![](/img/trans.png)
[英]How to compute weighted average of tensor A along an axis with weights specified by tensor B in tensorflow?
[英]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.