我最近开始玩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_size
、image_width
、image_height
和image_channels
。(1,224,224,3)
意味着VGG16
模型接受形状为224x224
的1
(一次一个图像(和三个通道(RGB(的批量大小。
有关什么是batch
以及batch size
的更多信息,您可以查看此交叉验证问题。
返回到VGG16
,体系结构的输入是(1, 224, 224, 3)
。这是什么意思?为了将图像输入到网络中,您需要:
- 预处理以达到(224224(和3个通道(RGB(的形状
- 将其转换为实际的形状矩阵(2242243(
- 将各种图像分组在一个需要网络的大小的批次中(在这种情况下,批次大小为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)
你可以一路上添加打印,看看发生了什么,但这里有一个简短的总结:
image.load_img()
加载PIL图像,该图像已为RGB,并已将其整形为(224224(image.img_to_array()
正在将该图像转换为形状矩阵(2242243(。如果您访问x[0,0,0],您将获得第一个像素的红色分量,该分量为0到255之间的数字- CCD_ 19正在添加第一个维度。x之后具有形状
(1, 224, 224, 3)
- 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)]]
看起来不错!