我正在使用 tensorflow 编写一个去噪自动编码器函数(有点长,所以我不会发布整个代码),除了当我向批处理添加掩蔽噪声时,一切都运行良好
掩蔽噪声只是将特征的随机比例设为 0。 所以问题只是将矩阵中的某些值设为 0。(如果我有一个用于 exepmle 的 np.array,那么这很简单)
所以我明白了,如果它是一个 tf.variable,如何通过 tf.scatter_update() 修改矩阵的一个元素 但是当我尝试使用占位符时,它会引发错误:“TypeError: 'ScatterUpdate' Op 要求输入 'ref' 是一个可变张量” 这有点问题
我可以通过在执行编码例程之前向批处理添加噪声来解决这个问题(然后我会处理 np.array 而不是 tf.placeholder),但我发现这个问题有点令人沮丧......
def bruit_MN(x,p=0.5):
l,c = x.shape
nbr = int(ceil(p*int(c))) #proportion of features to block
for i in range(l):
temp = np.zeros(c)
for j in range(nbr):
u = randint(0,c-1)
if temp[u]==0:
aux=tf.Variable(initial_value=x[i])
indices=tf.constant([u])
new_value=tf.constant([0.0])
aux=tf.scatter_update(aux,indices,new_value)
x=tf.scatter_update(x,i,aux)
temp[u] = 1
else:
j = j-1
return x
ps:也许代码不是最优的,我不能很好地控制随机函数
感谢您的关注!!
最佳答案
最简单的方法是在 TensorFlow 图之外创建噪声,正常对自动编码器进行建模,然后在训练时将损坏的输入和预期输出(干净的输入)提供给图占位符。
不可变张量的属性之一是它们是不可变的,所以你不能像 numpy 数组一样只获取张量的值并就地修改它。要使用分散更新,您需要一个缓冲区变量来操作,您可以使用它,但我会使用第一个选项或以下选项:
- 如果您想要屏蔽噪音之类的东西,您可以使用 dropout ;
- 对于高斯噪声,您可以使用 random_normal .
如果您确实需要更新不可变张量,我制作了这两个函数,它们采用稀疏张量进行更新,并分别修改给定的稀疏或稠密张量。即可获取here .
关于tensorflow - 他们是 tensorflow 中占位符的 scatter_update(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44803314/