是他们的 scatter_update() for placeholder in tensorflow
is their a scatter_update() for placeholder in tensorflow
我正在使用 tensorflow 编写去噪自动编码器函数(有点长,所以我不会 post 整个代码)并且一切都运行良好,除非我向批处理中添加屏蔽噪声
屏蔽噪声只是将特征的随机比例变为 0。
所以问题只是将矩阵中的某个值取为 0。(如果我有一个 np.array 作为例子则微不足道)
所以我明白了,如果它是 tf.variable,如何通过 tf.scatter_update() 修改矩阵的一个元素
但是当我尝试使用占位符时,它会引发错误:"TypeError: 'ScatterUpdate' Op requires that input 'ref' be a mutable tensor"
这有点问题
我可以通过在执行编码例程之前向批处理中添加噪音来解决这个问题(然后我会处理 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 编写去噪自动编码器函数(有点长,所以我不会 post 整个代码)并且一切都运行良好,除非我向批处理中添加屏蔽噪声
屏蔽噪声只是将特征的随机比例变为 0。 所以问题只是将矩阵中的某个值取为 0。(如果我有一个 np.array 作为例子则微不足道)
所以我明白了,如果它是 tf.variable,如何通过 tf.scatter_update() 修改矩阵的一个元素 但是当我尝试使用占位符时,它会引发错误:"TypeError: 'ScatterUpdate' Op requires that input 'ref' be a mutable tensor" 这有点问题
我可以通过在执行编码例程之前向批处理中添加噪音来解决这个问题(然后我会处理 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.