在模型上应用层有啥作用?
Posted
技术标签:
【中文标题】在模型上应用层有啥作用?【英文标题】:What does applying a layer on a model do?在模型上应用层有什么作用? 【发布时间】:2021-12-30 21:13:39 【问题描述】:我正在使用tensorflow.keras
API,我遇到了一个我不熟悉的语法,即在子模型的输出上应用一个层,如@987654321 中的以下示例所示@:
from tensorflow.keras import Model, layers
from tensorflow.keras.applications import resnet
target_shape = (200, 200)
base_cnn = resnet.ResNet50(
weights="imagenet", input_shape=target_shape + (3,), include_top=False
)
flatten = layers.Flatten()(base_cnn.output)
dense1 = layers.Dense(512, activation="relu")(flatten)
dense1 = layers.BatchNormalization()(dense1)
dense2 = layers.Dense(256, activation="relu")(dense1)
dense2 = layers.BatchNormalization()(dense2)
output = layers.Dense(256)(dense2)
embedding = Model(base_cnn.input, output, name="Embedding")
例如,在layers.Flatten
的official reference 中,我找不到关于将它应用到图层上的实际作用的解释。在keras.Layer
reference我遇到过这样的解释:
call(self, inputs, *args, **kwargs):在确保 build() 已被调用后在 call 中调用。 call() 执行将层应用于输入张量的逻辑(应作为参数传入)。
所以我的问题是:
flatten = layers.Flatten()(base_cnn.output)
是做什么的?
【问题讨论】:
好的,谢谢。但它并不是我想要的——我想知道应用程序在后台做了什么,我的意思是它是否添加了模型并在调用方法中的正向路径上使用它。因为这种语法是一种新的对我来说,我想对它为什么起作用有一些直觉。不过还是谢谢。 【参考方案1】:您正在基于预训练模型创建模型。除非您明确设置 trainable=True
,否则此预训练模型不会与您的其余层一起进行主动训练。也就是说,您只对提取其有用的特征感兴趣。展平操作通常用于将多维输出转换为一维张量,这正是这一行中发生的事情:flatten = layers.Flatten()(base_cnn.output)
。一维张量通常是模型的理想最终结果,尤其是在监督学习中。预训练的resnet
模型的输出是(None, 7, 7, 2048)
,您希望为每个输入生成一维特征向量并进行比较,因此您将输出展平,从而得到形状为(None, 100352)
或(None, 7 * 7 * 2048)
的张量.
Flatten
的替代方案是 GlobalMaxPooling2D
和 GlobalAveragePooling2D
,它们通过沿空间维度取最大值或平均值来对输入进行下采样。有关此主题的更多信息,请查看此post。
【讨论】:
以上是关于在模型上应用层有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章