我对神经网络和TensorFlow是新手
通常,当我们在TensorFlow中构建神经网络模型时,我们会以以下方式定义它:
model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
最近我用迁移学习写了一段代码,它以以下方式定义了模型:
x = layers.Flatten()(last_output)x = layers.Dense(1024, activation='relu')(x)x = layers.Dense(1,activation='sigmoid')(x)
这里的 last_output
是迁移学习模型的输出。
谁能解释这与顺序方法有何不同?另外,为什么前一层的输出会在新层的末尾用括号给出?
回答:
你描述的两种方式都是正确的。让我们一步一步来看。
-
第一个模型使用的是
Sequential
API。该API的声明如下。tf.keras.Sequential(layers=None, name=None)
该API接受 layers
参数作为一个列表,添加到模型中。
因此,你展示的例子如下。
model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(64, (3,3), activation='relu')])
在这里,顺序API将每一层堆叠在另一层之上并连接它们。该API自行管理前一层的输出作为下一层的输入。它为我们提供了便利性。
2.另一种方法是使用 Functional
API 创建模型。你可以将其视为调用层作为函数。你需要额外做的一件事是将前一层作为下一层的输入。因为Functional API不使用类似于列表的东西,所以API知道输入来自哪个层面的唯一方法是实际提供前一层作为参数。
所以以你的例子为例。
x = layers.Flatten()(last_output)x = layers.Dense(1024, activation='relu')(x)x = layers.Dense(1,activation='sigmoid')(x)
Functional API 会知道层 Flatten
需要连接到 last_output
层。然后,下一层密集层将连接到 Flatten
层,因为 x
作为参数传递给了它。我想你已经明白了这里的思路。
还有另一种创建模型的方法是通过子类化 Model
类。你可以在这里查看 Functional
API 和子类化 Model
类 这里。