我有一个使用Keras的深层网络,我需要在一层的输出上应用裁剪,然后发送到下一层。为此,我将以下代码编写为lambda层:
def cropping_fillzero(img, rate=0.6): # Q = percentage
residual_shape = img.get_shape().as_list()
h, w = residual_shape[1:3]
blacked_pixels = int((rate) * (h*w))
ratio = int(np.floor(np.sqrt(blacked_pixels)))
# width = int(np.ceil(np.sqrt(blacked_pixels)))
x = np.random.randint(0, w - ratio)
y = np.random.randint(0, h - ratio)
cropingImg = img[y:y+ratio, x:x+ratio].assign(tf.zeros([ratio, ratio]))
return cropingImg
decoded_noise = layers.Lambda(cropping_fillzero, arguments={'rate':residual_cropRate}, name='residual_cropout_attack')(bncv11)
但是它会产生以下错误,我不知道为什么?!
回溯(最近通话最近一次):
文件“”,第1行,在 运行文件('E:/code_v28-7-19/CIFAR_los4x4convolvedw_5_cropAttack_RandomSize_Pad.py', wdir ='E:/ code_v28-7-19')
文件 “ 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:/code_v28-7-19/CIFAR_los4x4convolvedw_5_cropAttack_RandomSize_Pad.py”, 第143行,在 encoded_noise =层数。Lambda(cropping_fillzero,arguments = {'rate':residual_cropRate}, name ='residual_cropout_attack')(bncv11)
文件 “ 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:/code_v28-7-19/CIFAR_los4x4convolvedw_5_cropAttack_RandomSize_Pad.py”, 第48行,在cropping_fillzero中 cropingImg = img [y:y + ratio,x:x + ratio] .assign(tf.zeros([ratio,ratio]))
文件 “ D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ array_ops.py”, 指定行700 引发ValueError(“仅变量支持切片分配”)
ValueError:仅变量支持切片分配
能否请您告诉我如何解决此错误? 谢谢
答案 0 :(得分:0)
h, w = residual_shape[1:3]
我不确定您要在这里做什么,但是Python将此解释为“在第二个元素和第四个元素之间返回”。也许您是说residual_shape[1], residual_shape[3]
?
答案 1 :(得分:0)
cropingImg = img[y:y+ratio, x:x+ratio].assign(tf.zeros([ratio, ratio]))
您正在尝试在张量上使用切片符号。切片符号只能用于变量,如错误消息所述。为了获取实际变量,请尝试使用tf.identity()加载上一层的输出:
self.output = your_layer
self.output = tf.identity(self.output, name='output')
output = graph.get_tensor_by_name('output:0')