使用Keras的预训练模型


使用Keras的预训练模型

通常,无需手动实现像GoogLeNet或ResNet这样的标准模型,因为在keras.applications包中只需一行代码即可获得预训练的网络。

例如,使用以下代码加载在ImageNet上预训练的ResNet-50模型:

from tensorflow import keras
model=keras.applications.resnet50.ResNet50(weights='imagenet')

这会创建一个ResNet-50模型并下载在ImageNet数据集上预训练的权重。要使用它,首先需要确保图像尺寸合适。ResNet-50模型需要\(224\times224\)像素的图像(其他模型可能需要其他尺寸,例如\(299\times229\))。可以使用tf.image.resize()来调整之前加载的图像的大小:

import tensorflow as tf
image_resized=tf.image.resize(images,[224,224])

tf.image.resize()不会保留宽高比。如果这是一个问题,需要在调整大小之前尝试将图像裁剪为适当的宽高比。两种操作可以使用tf.image.crop_and_resize()一次完成

预训练的模型假定以特定方式对图像进行预处理。在某些情况下,它们可能期待输入缩放到0到1,或从-1到1等等。每个模型都提供一个preprocess_input()函数,可以用来预处理图像。这些函数假定像素值的范围是0到255,因此必须将它们乘以255(因为之前将其缩放到0-1范围内):

inputs=keras.applications.resnet50.preprocess_input(images_resize*255)

现在可以使用预训练模型进行预测:

Y_proba=model.predict(inputs)

通常Y_proba输出一个矩阵,每个图像一行,每个类一列(在此例中,共有1000个类),如果要显示前K个预测(包括类名和每个预测类的估计概率),需要使用encode_predictions()函数。对于每个图像,它返回包含前K个预测的数组,其中每个预测都表示为一个包含标识符、其名称和对应置信度得分的数组:

top_K=keras.applications.resnet50.decode_predictions(Y_proba,top=3)
for image_index in range(len(images)):
    print('Image #{}'.format(image_index))
    for class_id,name,y_proba in top_K[image_index]:
        print('    {} - {:12s} {:.2f}%'.format(class_id,name,y_proba*100))
    print()

使用预先训练好的模型来创建一个好的图像分类器非常容易。Keras.applications中还提供了其他的视觉模型,包括多个ResNet变体、GoogLeNet变体、VGGNet变体以及MobileNet和MobileNetV2(用于移动应用的轻量级模型)

但是,如果要将图像分类器用于不属于ImageNet的图像类,在这种情况下,可以从预先训练的模型中受益,以进行迁移学习

相关