Keras Lambda层输出不是“符号张量”

时间:2019-01-11 07:13:28

标签: keras keras-layer

我正在使用带有tensorflow的Keras作为后端。我正在尝试为图像标准化定义Lambda层。当我尝试将Lamba层的输出提供给另一个Conv2D层时,出现错误:

  

使用非符号张量的输入调用了层conv2d_1

我阅读了Lamba层上的在线资料,每个人似乎都以与我相同的方式进行操作,但是我的代码以某种方式失败了。我只定义了一个预处理功能,并将图像传递给它。

def pre_process(image):

   norm = cv2.normalize(image, None, alpha=0, beta=1, 
          norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

   return norm

input_layer = Input(shape=(size, size, chs))
norm = Lambda(pre_process, output_shape=(size, size, chs))
conv_1 = Conv2D(16, kernel_size=(1, 1), strides=(1, 1), 
                    padding='valid', activation='relu')(norm)

定义conv_1层时出现错误:

  

使用不是符号张量的输入调用了层conv2d_1。收到的类型:。完整输入:[]。该层的所有输入都应为张量。

编辑1:

我修改了代码并遇到新的错误。新代码如下:

   def pre_process(image):    
    return tf.image.per_image_standardization(image[0])

   img_shape = (size, size, chs)
   input_layer = Input(shape=(img_shape))
   norm = Lambda(pre_process)(input_layer)
   conv_1 = Conv2D(16, kernel_size=(1, 1), strides=(1, 1), padding='valid', activation='relu')(norm)

归一化之后,由于我将形状从(1,w,h,3)更改为(w,h,3),因此出现错误:

  

ValueError:输入0与conv2d_2层不兼容:预期ndim = 4,找到ndim = 3

默认情况下,Lambda层应与输入层具有相同的形状,但实际情况并非如此。如何确保形状保持不变?

1 个答案:

答案 0 :(得分:1)

您没有使用输入调用lambda层,您应该这样做:

AdController.instance.showInterstitial();