【Keras】The added layer must be an instance of class Layer.

背景

本人使用keras 2.2 + tensorflow 1.14 遇到如下问题

The added layer must be an instance of class Layer. Found: Tensor("input_1:0", shape=(?, 300, 5, 2), dtype=float32)

代码

Keras代码如下:

代码如下:

model = Sequential(
    [
        Input(shape=(300, 5, 2)),
        Conv2D(10, kernel_size=(5, 1), activation="relu"),
        MaxPooling2D(pool_size=(2, 1)),
        Conv2D(8, kernel_size=(5, 1), activation="relu"),
        MaxPooling2D(pool_size=(2, 1)),
        Conv2D(4, kernel_size=(10, 3), strides=(10,1), activation="relu"),
        Flatten(),
        Dropout(0.2),
        Dense(NUM_CLASSES, activation="softmax"),
    ]
)

在这里插入图片描述

问题分析

Conv2D, Dense都是Keras中的layer,但是这里发现实际是Tensor类型。 很奇怪为什么明明是Layer却返回的是Tensor呢?

看了2.2源码,发现Input是返回的Tensor类型,所以后续的所有入参似乎收到了影响。
看下面截图,Input是初始化一个Keras Tensor类型的实例
在这里插入图片描述

解决方案

去掉Input的使用,改为在第一层layer中加入input_shape类型

model = Sequential(
    [
        # 去掉这里的Input,改为第一层加入input_shape
        # Input(shape=(300, 5, 2)),
        Conv2D(10, input_shape=(300, 5, 2), kernel_size=(5, 1), activation="relu"),
        MaxPooling2D(pool_size=(2, 1)),
        Conv2D(8, kernel_size=(5, 1), activation="relu"),
        MaxPooling2D(pool_size=(2, 1)),
        # LayerNormalization(),
        Conv2D(4, kernel_size=(10, 3), strides=(10,1), activation="relu"),

        #tf.keras.layers.LayerNormalization(),
        Flatten(),

        Dropout(0.2),
        Dense(NUM_CLASSES, activation="softmax"),
    ]
)

注意事项

keras自2.0时代融合进入tensorflow,所以在使用tensorflow.keras时,似乎上述问题并不存在。请注意。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值