为什么会发生此错误:“仅变量支持切片分配”

时间:2019-08-06 14:04:20

标签: python tensorflow keras tensor

我有一个使用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:仅变量支持切片分配

能否请您告诉我如何解决此错误? 谢谢

2 个答案:

答案 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')