Tensorflow预训练模型输入通道范围

时间:2020-07-09 15:58:29

标签: python tensorflow keras

我遇到了这个example,它实现了预先训练的模型。它说:

格式化数据

使用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]。在这个comment中,它说所有预训练的张量流模型都需要输入通道[-1,1]。真的吗?尤其是tensorflow hub中的所有模型(如果涉及图像)是否要求[-1,1]范围是真的吗?

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

此外:有没有一种方法可以自动完成此任务?这样我就可以使用一个函数并自动检查经过预训练的tensorflow数据集(该对象具有存储该信息的对象)并应用它(假设输入为0-255)?我认为tf.keras.applications.mobilenet_v2.preprocess_input正在做其他事情(我不是很了解它的作用)吗?而且也只适用于mobilenetv2。

1 个答案:

答案 0 :(得分:0)

通常,您担心“我应该在[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的文档,以使用他们的预先训练的模型。如果在他们的文档中找不到任何扩展,则应避免对其进行扩展。

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