构建Keras模型的3种方法
有三种方法可以在TensorFlow中构建Keras模型:
Sequential API:当你试图使用单个输入、输出和层分支构建简单模型时,Sequential API是最好的方法。对于想快速学习的新手来说,这是一个很好的选择。
Functional API:函数API是构建Keras模型最流行的方法。它可以完成Sequential API所能做的一切。此外,它允许多个输入、多个输出、分支和层共享。它是一种简洁易用的方法,并且仍然允许很好的定制灵活性。
模型子类化:模型子类化是为需要完全控制模型、层和训练过程的高级开发人员设计的。你需要创建一个定义模型的自定义类,而且你可能不需要它来执行日常任务。但是,如果你是一个有实验需求的研究人员,那么模型子类化可能是最好的选择,因为它会给你所有你需要的灵活性。
Sequential API
在Sequential API中,我们需要tf.keras.Models模块。我们可以简单地将下面的所有层作为一个单独的层来传递。如你所见,这很简单。
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(256,‘relu’),
Dense(10, “softmax”),
])
Functional API
对于Functional API,我们需要单独定义我们的输入。然后,我们需要创建一个输出对象,同时创建所有层,这些层相互关联并与输出相关联。最后,我们创建一个接受输入和输出作为参数的模型对象。代码仍然非常干净,但是我们在Functional API中有了更大的灵活性。
inputs = Input(shape=(28, 28))
x = Flatten()(inputs)
x = Dense(256, “relu”)(x)
outputs = Dense(10, “softmax”)(x)model = Model(inputs=inputs, outputs=outputs, name=“mnist_model”)
模型子类化
让我们继续讨论模型子类化。在模型子类化中,我们从创建一个扩展类基于tf.keras.Model 。模型子类化有两个关键功能:
init__函数充当构造函数。多亏了__init,我们可以初始化模型的属性(例如,layer)。super调用父构造函数( tf.keras.Model中的构造函数)self用于引用实例属性。
call function是在定义层之后定义操作的地方。
为了使用模型子类化来构建同一个模型,我们需要编写更多的代码,如下所示:
class CustomModel(tf.keras.Model):
def init(self, **kwargs):
super(CustomModel, self).init(**kwargs)
self.layer_1 = Flatten()
self.layer_2 = Dense(256, “relu”)
self.layer_3 = Dense(10, “softmax”)def call(self, inputs):
x = self.layer_1(inputs)
x = self.layer_2(x)
x = self.layer_3(x)
return xmodel = CustomModel(name=‘mnist_model’)
模型训练
现在你可以用三种不同的方法创建同一个模型,你可以选择其中任何一个,构建模型,并运行下面的代码。
model.compile(optimizer=‘adam’,
loss=‘sparse_categorical_crossentropy’,
metrics=[‘accuracy’])model.fit(x=x_train,y=y_train, epochs=10)
model.evaluate(x_test, y_test)