【问题标题】:How to convert keras sequential API to functional API如何将 keras 顺序 API 转换为功能 API
【发布时间】:2020-09-02 21:15:23
【问题描述】:

我是深度学习的新手,正在尝试将此顺序 API 转换为功能 API,以便在 CIFAR 10 数据集上运行。以下是顺序 API:

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu')

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

这是我将其转换为功能 API 的尝试:

model_input = Input(shape=input_shape)

x = Conv2D(32, (3, 3), activation='relu',padding='valid')(model_input)
x = MaxPooling2D((2,2))(x)
x = Conv2D(32, (3, 3), activation='relu')(x)
x = MaxPooling2D((2,2))(x)
x = Conv2D(32, (3, 3))(x)

x = GlobalAveragePooling2D()(x)
x = Activation(activation='softmax')(x)

model = Model(model_input, x, name='nin_cnn')

x = layers.Flatten()
x = layers.Dense(64, activation='relu')
x = layers.Dense(10)

这是编译和训练代码:

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))

原始顺序 API 的准确度为 0.7175999879837036,而函数式 API 的准确度为 0.0502999983727932。不确定我在重写代码时哪里出错了,任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python machine-learning keras deep-learning image-recognition


    【解决方案1】:

    除了@adrtam 提到的,我想补充一些,因为用户是初学者。

    顺序模型和函数模型之间有几个重要的区别。函数式和顺序式几乎相似,除了,

    所以Sequential是单输入单输出,层可以逐层添加/堆叠。功能性为定制提供了更大的灵活性。所以,在某种程度上我们可以说 Sequential 是 Functional Model 的子集。

    来到你的案子,
    这是一个顺序模型

    from tensorflow import keras
    from tensorflow.keras import layers
    from tensorflow.keras import models
    input_shape=(32, 32, 3)
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10))
    

    这里是功能模型。

    from tensorflow.keras import Model
    from tensorflow.keras import layers
    model_input = layers.Input(shape=input_shape)
    x = layers.Conv2D(32, (3, 3), activation='relu',padding='valid')(model_input)
    x = layers.MaxPooling2D((2,2))(x)
    x = layers.Conv2D(64, (3, 3), activation='relu')(x)
    x = layers.MaxPooling2D((2,2))(x)
    x = layers.Conv2D(64, (3, 3), activation='relu')(x)
    x = layers.Flatten()(x)
    x = layers.Dense(64, activation='relu')(x)
    x = layers.Dense(10)(x)
    
    model2 = Model(model_input, x, name='nin_cnn')
    

    【讨论】:

    • 使用这个函数模型后,程序的准确率仍然在 10% 左右。我不确定哪里出了问题。如果您想看一下,我可以发布整个代码吗?干杯。
    【解决方案2】:

    你的两个模型不一样。第二个和第三个卷积层分别有 64 个单元和 32 个单元用于示例代码中的顺序模型和功能模型。而且您没有在功能模型中包含全连接层(您仅在构建模型后才创建这些层)。

    如果以后有疑问,可以尝试做

    model.summary()
    

    并比较看看模型是否相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多