我想裁剪张量的某些部分并将这些部分分配为零。为此目的,我使用了以下代码,但是会产生以下错误。如何解决这个问题?我正在使用Keras,并且有CNN网络。 x是卷积层和张量的输出。 谢谢。
def diff_cropout(x, rate=0.6):
global block_size
cover_img =x[0]
Iw = x[1]
diff = Iw - cover_img
diff_shape = diff.get_shape().as_list()
h, w = diff_shape[1:3]
blacked_pixels = int(rate * (h*w))
height = int(np.floor(np.sqrt(blacked_pixels)))
width = int(np.ceil(np.sqrt(blacked_pixels)))
x = np.random.randint(0, w - width)
y = np.random.randint(0, h - height)
new_diff = diff
new_diff = new_diff[y:y+height, x:x+width].assign(tf.zeros([height, width]))
new_Iw = cover_img + new_diff
return new_I
在我的网络中:
diff_cropout_attacked = layers.Lambda(diff_cropout, arguments={'rate':diff_cropRate}, name='diff_cropout_attack')([image, actimg])
错误:
回溯(最近通话最近一次):
文件“”,第1行,在 runfile('E:/ New folder / testattack.py', wdir ='E:/ New folder')
文件 “ D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py”, 运行文件中的第704行 execfile(文件名,命名空间)
文件 “ D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py”, execfile中的第108行 exec(compile(f.read(),文件名,'exec'),命名空间)
文件“ E:/Newfolder/testattack.py”,第319行,在 diff_cropout_attacked =层数。Lambda(diff_cropout,arguments = {'rate':diff_cropRate}, name ='residual_cropout_attack')([image,actimg])
文件 “ D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ base_layer.py”, 第457行,致电 输出= self.call(输入,** kwargs)
文件 “ D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ layers \ core.py”, 687行,正在通话中 返回self.function(inputs,** arguments)
文件“ E:/Newfolder/testattack.py”,第199行,位于diff_cropout中 new_diff = new_diff [y:y + height,x:x + width] .assign(tf.zeros([height,width]))
文件 “ D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ array_ops.py”, 指定行700 引发ValueError(“仅变量支持切片分配”)
ValueError:仅变量支持切片分配