【问题标题】:Keras Creating CNN Model "The added layer must be an instance of class Layer"Keras 创建 CNN 模型“添加的层必须是类层的实例”
【发布时间】:2020-06-18 08:49:04
【问题描述】:
from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from tensorflow.keras.layers import Dropout, Flatten, Input, Dense

def create_model():

    def add_conv_block(model, num_filters):

        model.add(Conv2D(num_filters, 3, activation='relu', padding='same'))
        model.add(BatchNormalization())
        model.add(Conv2D(num_filters, 3, activation='relu', padding='valid'))
        model.add(MaxPooling2D(pool_size=2))
        model.add(Dropout(0.2))

        return model

    model = tf.keras.models.Sequential()
    model.add(Input(shape=(32, 32, 3)))

    model = add_conv_block(model, 32)
    model = add_conv_block(model, 64)
    model = add_conv_block(model, 128)

    model.add(Flatten())
    model.add(Dense(3, activation='softmax'))

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

model = create_model()
model.summary()

enter image description here

【问题讨论】:

  • 刚刚测试了一下,没有报错。请详细说明。
  • TypeError: 添加的层必须是类Layer的实例。找到:Tensor("input_1:0", shape=(?, 32, 32, 3), dtype=float32)
  • @MarcoCerliani 是的,我仍然收到同样的错误。
  • 我提供了一个答案,别忘了点赞并接受它;-)

标签: python tensorflow keras conv-neural-network


【解决方案1】:

解决方案是使用InputLayer 而不是InputInputLayer 旨在与 Sequential 模型一起使用。您也可以完全省略InputLayer,并在顺序模型的第一层中指定input_shape

Input 旨在与 TensorFlow Keras 函数式 API 一起使用,而不是顺序 API。

from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from tensorflow.keras.layers import Dropout, Flatten, InputLayer, Dense

def create_model():

    def add_conv_block(model, num_filters):

        model.add(Conv2D(num_filters, 3, activation='relu', padding='same'))
        model.add(BatchNormalization())
        model.add(Conv2D(num_filters, 3, activation='relu', padding='valid'))
        model.add(MaxPooling2D(pool_size=2))
        model.add(Dropout(0.2))

        return model

    model = tf.keras.models.Sequential()
    model.add(InputLayer((32, 32, 3)))

    model = add_conv_block(model, 32)
    model = add_conv_block(model, 64)
    model = add_conv_block(model, 128)

    model.add(Flatten())
    model.add(Dense(3, activation='softmax'))

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

model = create_model()
model.summary()

【讨论】:

  • 谢谢@jakub
【解决方案2】:

我认为这个问题与 TF 版本有关……但是我建议你使用这个实现。这样就可以在顺序模型的第一层指定input_shape,覆盖问题

def create_model():

    def add_conv_block(model, num_filters, input_shape=None):

        if input_shape:
            model.add(Conv2D(num_filters, 3, activation='relu', padding='same', input_shape=input_shape))
        else:
            model.add(Conv2D(num_filters, 3, activation='relu', padding='same'))

        model.add(BatchNormalization())
        model.add(Conv2D(num_filters, 3, activation='relu', padding='valid'))
        model.add(MaxPooling2D(pool_size=2))
        model.add(Dropout(0.2))

        return model

    model = tf.keras.models.Sequential()
    model = add_conv_block(model, 32, input_shape=(32, 32, 3))
    model = add_conv_block(model, 64)
    model = add_conv_block(model, 128)

    model.add(Flatten())
    model.add(Dense(3, activation='softmax'))

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    return model

model = create_model()
model.summary() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2019-02-05
    • 2019-08-14
    • 1970-01-01
    • 2019-08-19
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多