Keras:VGG16中的model.input是什么



我最近开始玩keras和vgg16,我正在使用keras.applications.vgg16。

但在这里,我提出了一个关于什么是model.inputs的问题,因为我看到其他人在https://github.com/keras-team/keras/blob/master/examples/conv_filter_visualization.py尽管它没有初始化

...
input_img = model.input
...
layer_output = layer_dict[layer_name].output
if K.image_data_format() == 'channels_first':
loss = K.mean(layer_output[:, filter_index, :, :])
else:
loss = K.mean(layer_output[:, :, :, filter_index])
# we compute the gradient of the input picture wrt this loss
grads = K.gradients(loss, input_img)[0]

我检查了keras站点,但它只说这是一个具有形状的输入张量(1224224,3(,但我仍然不明白这到底是什么。那是ImageNet的图片吗?还是keras为keras模型提供的默认图像?

如果我对深度学习没有足够的理解,我很抱歉,但有人能给我解释一下吗。感谢

(1,224,224,3)的4个维度分别是batch_sizeimage_widthimage_heightimage_channels(1,224,224,3)意味着VGG16模型接受形状为224x2241(一次一个图像(和三个通道(RGB(的批量大小。

有关什么是batch以及batch size的更多信息,您可以查看此交叉验证问题。

返回到VGG16,体系结构的输入是(1, 224, 224, 3)。这是什么意思?为了将图像输入到网络中,您需要:

  1. 预处理以达到(224224(和3个通道(RGB(的形状
  2. 将其转换为实际的形状矩阵(2242243(
  3. 将各种图像分组在一个需要网络的大小的批次中(在这种情况下,批次大小为1,但您需要向矩阵添加一个维度,以获得(1,224224,3(

完成此操作后,可以将图像输入到模型中。

Keras提供了很少的实用函数来完成这些任务。下面我展示了中所示代码片段的修改版本。使用VGG16从文档中的图像分类模型的使用示例中提取功能。

为了让它真正工作,您需要一个名为elephant.jpg的任何大小的jpg。您可以通过运行以下bash命令获得它:

wget https://upload.wikimedia.org/wikipedia/commons/f/f9/Zoorashia_elephant.jpg -O elephant.jpg   

为了清晰起见,我将在图像预处理和模型预测中拆分代码:

加载图像

import numpy as np
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

你可以一路上添加打印,看看发生了什么,但这里有一个简短的总结:

  1. image.load_img()加载PIL图像,该图像已为RGB,并已将其整形为(224224(
  2. image.img_to_array()正在将该图像转换为形状矩阵(2242243(。如果您访问x[0,0,0],您将获得第一个像素的红色分量,该分量为0到255之间的数字
  3. CCD_ 19正在添加第一个维度。x之后具有形状(1, 224, 224, 3)
  4. CCD_ 21正在进行图像网络训练架构所需的额外预处理。从它的docstring(运行help(preprocess_input)(中,您可以看到它:

    将图像从RGB转换为BGR,然后将每个颜色通道相对于ImageNet数据集归零,而不缩放

这似乎是ImageNet训练集的标准输入。

这就是预处理,现在你只需要在预训练的模型中输入图像,就可以得到预测

预测

y_hat = base_model.predict(x)
print(y_hat.shape) # res.shape (1, 1000)

CCD_ 23包含分配给该图像的模型的1000个图像网类别中的每一个的概率。

为了获得类名和可读的输出,keras还提供了一个实用函数:

from keras.applications.vgg16 import decode_predictions
decode_predictions(y_hat)

输出,对于我之前下载的Zoorashia_elephant.jpg图像:

[[('n02504013', 'Indian_elephant', 0.48041093),
('n02504458', 'African_elephant', 0.47474155),
('n01871265', 'tusker', 0.03912963),
('n02437312', 'Arabian_camel', 0.0038948185),
('n01704323', 'triceratops', 0.00062475674)]]

看起来不错!

最新更新