Tensorflow 通过Sequential()实现网络和直接实现网络之间的区别?

Tensorflow 通过Sequential()实现网络和直接实现网络之间的区别?,tensorflow,keras,Tensorflow,Keras,及 这两种实现之间的区别是什么?我知道这两个都做同样的事情 我试图使用TensorFlow实现Inception模型,但在实现Inception\u block函数时遇到了一个问题。我可以采用第二个版本并开始使用下面提到的代码,但我想使用Sequential()和add()实现同样的功能 model = tf.keras.layers.Input(shape=(32,32, 3)) model = tf.keras.layers.Dense(10)(model) 根据文件: 定义模型有3种方法

这两种实现之间的区别是什么?我知道这两个都做同样的事情

我试图使用TensorFlow实现Inception模型,但在实现Inception\u block函数时遇到了一个问题。我可以采用第二个版本并开始使用下面提到的代码,但我想使用Sequential()add()实现同样的功能

model = tf.keras.layers.Input(shape=(32,32, 3))
model = tf.keras.layers.Dense(10)(model)
根据文件:

定义模型有3种方法:

  • 顺序:(您的第一种方法)顺序模型,非常简单(一个简单的层列表),但仅限于层的单个输入、单个输出堆栈(顾名思义)

  • Functional API:(您的第二种方法)Functional API,它是一种易于使用、功能齐全的API,支持任意模型架构。对于大多数人和大多数用例,这是您应该使用的

  • 模型子类化:在这里,您可以自己从头开始实现一切。如果您有复杂的开箱即用的研究用例,请使用此选项

所以,因为初始模型有分支,所以不能使用顺序模型来实现。您应该使用函数API,或者从模型创建一个子类,从头开始实现您的模型


请注意,即使是函数式API也有一些限制。它仅适用于层的有向无环图的模型,例如MobileNet、Inception等(没有循环或循环的模型)。对于更奇特的体系结构,例如动态和递归网络或可能动态更改的体系结构,您必须使用模型子类化。

您问错了问题,初始块不是一组连续的层,因此,它不能使用顺序模型来实现。@Dr.Snoopy,但有没有办法在Keras中以并行方式堆叠多个顺序模型?没有,使用函数API。
model = tf.keras.layers.Input(shape=(32,32, 3))
model = tf.keras.layers.Dense(10)(model)
def inception_block(model, filter_map):
  path1 = tf.keras.layers.Conv2D(filter_map[0], (1, 1), padding='same', activation='relu')(model)
  
  path2 = layers.Conv2D(filter_map[1], (1, 1), padding='same', activation='relu')(model)
  path2 = layers.Conv2D(filter_map[2], (1, 1), padding='same', activation='relu')(path2)

  return tf.concat([path1, path2], axis=3)
input_ = tf.keras.layers.Input(shape=(32, 32, 3))
input_tensor = tf.keras.layers.experimental.preprocessing.Resizing(224, 224, interpolation="bilinear", input_shape=x_train.shape[1:])(input_)
x = tf.keras.layers.Conv2D(64, 7, strides=2, padding='same', activation='relu')(input_tensor)
x = tf.keras.layers.MaxPooling2D(3, strides=2)(x)
x = tf.keras.layers.Conv2D(64, 1, strides=1, padding='same', activation='relu')(x)
x = tf.keras.layers.Conv2D(192, 3, strides=1, padding='same', activation='relu')(x)
x = tf.keras.layers.MaxPooling2D(3, strides=2)(x)
x = inception_block(x, [64, 64, 192])
x = tf.keras.layers.MaxPooling(3, strides=2)(x)