tensorflow - 他们是 tensorflow 中占位符的 scatter_update()

标签 tensorflow noise autoencoder

我正在使用 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/

相关文章:

c++ - 编译用于ARM64-v8a的Tensorflow C++ API

python - TensorFlow 中的变换矩阵

用于读取稀疏数据的 TensorFlow 输入函数(采用 libsvm 格式)

Matlab 滤波器加速数据中的电尖峰

python - 对于变分自动编码器,重建损失应该计算为图像的总和还是平均值?

python - 自动编码器适用于 MNIST,但对于较大尺寸的图像会崩溃

python - 采用 Keras 变分自动编码器对图像进行去噪

python - Tensorflow 分层样本错误

numpy - 如何通过Python : NumPy/SciPy?直接在频域中生成高斯分布的随机样本

python - 向 numpy 数组添加噪声