在模型上应用层有啥作用?

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.Layerreference我遇到过这样的解释:

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 的替代方案是 GlobalMaxPooling2DGlobalAveragePooling2D,它们通过沿空间维度取最大值或平均值来对输入进行下采样。有关此主题的更多信息,请查看此post。

【讨论】:

以上是关于在模型上应用层有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

在建筑工程中BIM模型有啥作用?

rpc服务是啥 有啥作用 能改成另一个吗

在同一个模型上多次调用 fit() 有啥作用?

webservice是啥,有啥作用啊

xgboost ML 模型的 get_fscore() 有啥作用? [复制]

weka 中的 ClusterMembership 类有啥作用?