背景
本人使用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时,似乎上述问题并不存在。请注意。