如何将 keras 顺序 API 转换为函数式 API
How to convert keras sequential API to functional API
我是深度学习的新手,我正在尝试将此顺序 API 转换为 CIFAR 10 数据集上的函数式 API 至 运行。下面是顺序 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。不确定我在重写代码时出了什么问题,任何帮助将不胜感激。谢谢。
你的两个型号不一样。第二个和第三个卷积层分别有 64 个单元和 32 个单元用于示例代码中的顺序模型和功能模型。而且您没有在您的功能模型中包含全连接层(您仅在构建模型后才创建这些层)。
以后如果有疑问,可以尝试做
model.summary()
并比较模型是否相同。
除了@adrtam 提到的内容,我想再补充一些,因为用户是初学者。
顺序模型和函数模型之间有几个重要的区别。 Functional 和 Sequential 几乎相似,除了
所以Sequential是单输入单输出,layers可以added/stacked层层叠加。功能是更灵活的定制。因此,在某种程度上我们可以说顺序是功能模型的子集。
针对您的情况,
这是一个顺序模型
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')
我是深度学习的新手,我正在尝试将此顺序 API 转换为 CIFAR 10 数据集上的函数式 API 至 运行。下面是顺序 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。不确定我在重写代码时出了什么问题,任何帮助将不胜感激。谢谢。
你的两个型号不一样。第二个和第三个卷积层分别有 64 个单元和 32 个单元用于示例代码中的顺序模型和功能模型。而且您没有在您的功能模型中包含全连接层(您仅在构建模型后才创建这些层)。
以后如果有疑问,可以尝试做
model.summary()
并比较模型是否相同。
除了@adrtam 提到的内容,我想再补充一些,因为用户是初学者。
顺序模型和函数模型之间有几个重要的区别。 Functional 和 Sequential 几乎相似,除了
所以Sequential是单输入单输出,layers可以added/stacked层层叠加。功能是更灵活的定制。因此,在某种程度上我们可以说顺序是功能模型的子集。
针对您的情况,
这是一个顺序模型
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')