我是神经网络和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
参数作为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不使用与List类似的东西,因此API知道输入来自哪一层的唯一方法是实际提供前一层作为参数。
因此,以您为例。
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation='relu')(x)
x = layers.Dense(1,activation='sigmoid')(x)
功能性API将知道该层Flatten
需要连接到该last_output
层。然后,下一个密集层将作为参数传递给该Flatten
层x
。我想你在这里有了主意。
创建模型的另一种方法是对Model
类进行子类化。您可以在此处查看Functional
API和子Model
类类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句