张量流预训练模型输入通道范围



我遇到了这个实现预训练模型的例子。它说:

设置数据格式

使用 tf.image 模块设置任务的图像格式。

将图像大小调整为固定的输入大小,并重新缩放输入 通道范围为 [-1,1]

IMG_SIZE = 160 # All images will be resized to 160x160
def format_example(image, label):
image = tf.cast(image, tf.float32)
image = (image/127.5) - 1
image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
return image, label

我想知道这个。我的理解是,image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))将图像(可以具有任何大小)调整为一个一致的大小。我知道image = (image/127.5) - 1不会更改图像的实际大小,而是将值(像素)(介于 0 到 255 之间)更改为 [-1,1] 的范围。在其他示例中,我看到规范化/标准化被执行到 [0,1] 的范围,因此重新缩放 1.0/255。我不明白什么时候必须使用哪个。如果我使用自己的模型,是否可以扩展到 [-1,1] 或 [0,1] 的范围?但是,当我使用预训练模型时,我需要知道需要什么。我用谷歌搜索了mobilenetv2模型,但找不到任何文档告诉我所需的输入通道是[-1,1]。在此注释中,它说所有预训练的张量流模型都需要输入通道 [-1,1]。这是真的吗?特别是,张量流集线器中的所有模型(如果关于图像)都需要 [-1,1] 的范围吗?

最后,如何找出预训练模型所需的范围?我自己不会弄清楚 MobileNetv2 中的 [-1,1]。在 tensorflow MobileNetv2 页面上,我找不到此信息。

此外:有没有办法基本上自动完成此操作?所以我使用一个函数,它会自动检查预训练的 tensorflow 数据集(它有一个存储该信息的对象)并应用它(假设 0-255 是我的输入)?我认为tf.keras.applications.mobilenet_v2.preprocess_input正在做其他事情(我并不真正了解它的作用)?它也仅适用于mobilenetv2。

通常,您关心的是"我应该在 [0, 1]、[-1, 1] 之间选择什么缩放?由于答案可能因情况而异,因此我想在下面指出它们。

  1. CNN 架构在短距离输入值下效果更好。因此,[0, 1] 和 [-1, 1] 可能都是不错的选择。但是,根据体系结构的不同,选择可能会有所不同。因此,尝试各种秤将是一个不错的选择。

  2. 关于 Keras 的预训练模型,我注意到大多数使用残差(例如,ResNetsMobileNetV2InceptionResNetV2)的模型都使用 [-1, 1] 尺度。在某些情况下,在残差中使用 [-1, 1] 刻度会导致某些边被停用。为了进一步理解,让我们考虑一个 感知器y = wx + b.如果w = 1b = 1则使用输入x = 1结果y = 0。这说明使用 [-1, 1] 刻度时,某些输入值可以被偏差抵消(无需设置w=0)。这个概念也适用于其他模型(不包括 Keras)。

  3. 几乎所有的 Keras 架构都使用扩展技术。我相信在某些情况下,他们没有执行原始论文指示的建议操作。因此,我认为在使用其预训练模型的情况下,您应该坚持使用 Keras 的文档。如果您在他们的文档中没有找到任何缩放,则应避免缩放它。

此外,您应该尝试在使用不同的数据集时测试不同的缩放方法。但是,在大多数情况下,这应该不会高度提高模型的准确性。如果您还有其他疑问,请告诉我。谢谢。

最新更新