我使用 Keras 和 tensorflow 作为后端。我正在尝试定义一个用于图像标准化的 Lambda 层。当我尝试将 Lamba 层的输出提供给另一个 Conv2D 层时,出现错误:
Layer conv2d_1 was called with an input that isn't a symbolic tensor
我阅读了有关 Lamba 层的在线 Material ,每个人似乎都按照我所做的方式进行操作,但不知何故我的代码失败了。我简单地定义了一个预处理函数并通过它传递图像。
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
层时出现错误:
Layer conv2d_1 was called with an input that isn't a symbolic tensor. Received type: . Full input: []. All inputs to the layer should be tensors.
编辑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: Input 0 is incompatible with layer conv2d_2: expected ndim=4, found ndim=3
默认情况下,Lambda 层应采用与输入层相同的形状,但这里情况并非如此。如何确保形状保持不变?
最佳答案
您没有使用输入调用 lambda 层,您应该这样做:
input_layer = Input(shape=(size, size, chs))
norm = Lambda(pre_process, output_shape=(size, size, chs))(input_layer)
conv_1 = Conv2D(16, kernel_size=(1, 1), strides=(1, 1),
padding='valid', activation='relu')(norm)
关于Keras Lambda 层输出不是 "symbolic tensor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54141897/