是tensorflow中占位符的scatter_update()

时间:2017-06-28 13:02:43

标签: tensorflow noise autoencoder

我正在使用张量流编码去噪自动编码器功能(这有点长,所以我不会发布整个代码)并且每件事情都运行良好,除非我在批处理中添加掩蔽噪声

掩蔽噪声只是将特征的随机比例设为0。 所以问题就是在矩阵中取一些值为0.(如果我有一个np.array用于exepmle那么琐碎)

所以我看,如果它是一个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:也许代码不是最优的我不能很好地控制随机函数

感谢您的关注!!

1 个答案:

答案 0 :(得分:2)

最简单的方法是在TensorFlow图形之外创建噪声,正常模拟自动编码器,然后在训练时将损坏的输入和预期输出(清洁输入)提供给图形占位符。

不可变张量的一个属性是它们是不可变的,所以你不能只取一个张量的值并像一个numpy数组那样修改它。要使用分散更新,您需要一个缓冲变量来操作,您可以使用但我会使用第一个选项或以下选项:

  • 如果您想要屏蔽噪音,可以使用dropout;
  • 对于高斯噪音,您可以使用random_normal

如果你真的需要更新一个不可变张量我做了这两个函数,它们采用稀疏张量和更新,并分别修改给定的稀疏或密集张量。你可以得到它here