我是神经网络和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是迁移学习模型的输出。
有人能解释一下这与顺序法有何不同吗?另外,为什么在新层末尾的括号中给出了前一层的输出?
发布于 2020-08-16 18:45:42
你所描述的两种方式都是正确的。让我们一步一步地看一看。
Sequential API.The声明,如下所示。
tf.keras.Sequential( layers=None,name=None )API将layers参数作为要添加到模型中的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知道输入来自哪个层的唯一方法是实际上提供前一个层作为参数。
所以以你为例。
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation='relu')(x)
x = layers.Dense(1,activation='sigmoid')(x) functional将知道层Flatten需要连接到last_output层。然后,下一个密集层将连接到Flatten层,因为x作为参数传递给它。我想你知道这个主意了。
还有一种创建模型的方法是对Model类进行子类化。您可以查看Functional API和子类Model类这里。
https://stackoverflow.com/questions/63435397
复制相似问题