keras提供了VGG19在ImageNet上的预训练权重模型文件,其他可用的模型还有VGG16、Xception、ResNet50、InceptionV3 4个。

VGG19在keras中的定义:

def VGG19(include_top=True, weights='imagenet',input_tensor=None, input_shape=None,pooling=None,classes=1000)

参数介绍:

include_top: 是否包含最后的3个全连接层

weights: 定义为‘imagenet’,表示加载在imagenet数据库上训练的预训练权重,定义为None则不加载权重,参数随机初始化

1)使用VGG19预训练模型分类图片的例子

# coding: utf-8
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as npbase_model = VGG19(weights='imagenet', include_top=True)
img_path = 'cat.jpg'
img = image.load_img(img_path, target_size=(224, 224))  # 加载图像,归一化大小
x = image.img_to_array(img)   # 序列化
x = np.expand_dims(x, axis=0)  # 扩展维度[batch_size,H,W,Channel]
x = preprocess_input(x)       # 预处理,默认mode="caffe"
"""
def preprocess_input(x, data_format=None, mode='caffe'):Preprocesses a tensor or Numpy array encoding a batch of images.# Argumentsx: Input Numpy or symbolic tensor, 3D or 4D.data_format: Data format of the image tensor/array.mode: One of "caffe", "tf".- caffe: will convert the images from RGB to BGR,then will zero-center each color channel withrespect to the ImageNet dataset,without scaling.- tf: will scale pixels between -1 and 1,sample-wise.# ReturnsPreprocessed tensor or Numpy array.# RaisesValueError: In case of unknown `data_format` argument.
"""
out = base_model.predict(x)  # 预测结果,1000维的向量
print(out.shape)   # 预测结果out是一个1000维的向量,代表了预测结果分别属于10000个分类的概率,形状是(1,1000)

2) 使用VGG19预训练模型提取VGG19网络中任意层的输出特征的例子

上个例子可以看到keras对VGG网络的封装异常好,简单几行代码就可以分类图片。keras中VGG预训练参数模型另一个更常用的应用是可以提取VGG网络中任意一层的特征。
以下例子提取的是VGG19网络中第5个卷积层的输出特征(也是第1个全连接层的输入特征)

# coding: utf-8
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as npbase_model = VGG19(weights='imagenet', include_top=False)
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block5_pool').output)
img_path = 'cat.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)
block5_pool_features = model.predict(x)
print(block5_pool_features.shape) #(1, 7, 7, 512)

也可以设置为加载最后3个全连接层的VGG19网络,就可以获取最后3个全连接层的输出了:

# coding: utf-8
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
base_model = VGG19(weights='imagenet', include_top=True)
model = Model(inputs=base_model.input, outputs=base_model.get_layer('fc2').output)
img_path = 'cat.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)
fc2 = model.predict(x)
print(fc2.shape)  #(1, 4096)

加了全连接层,所以base_model.get_layer('fc2') 里参数也可以是 flatten、fc1、fc2和predictions 。

VGG19各个模块在keras中定义的名称可以通过以下代码获得,然后根据名称可以轻松获取该层特征::

from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
import os
import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
gpu_options = tf.GPUOptions(allow_growth=True)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
from keras.utils import plot_model
from matplotlib import pyplot as plt#【0】VGG19模型,加载预训练权重
base_model = VGG19(weights='imagenet')#【1】创建一个新model, 使得它的输出(outputs)是 VGG19 中任意层的输出(output)
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)
print(model.summary())                                 # 打印模型概况,如下所示
plot_model(model,to_file = 'a simple convnet.png')     # 画出模型结构图,并保存成图片,如下图所示
"""
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_conv4 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_conv4 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0
=================================================================
Total params: 10,585,152
Trainable params: 10,585,152
Non-trainable params: 0
_________________________________________________________________"""

3)最终的特征提取代码

# -*- coding: UTF-8 -*-
#-------------------------------------------
#任 务:利用VGG19提取任意中间层特征
#数 据:网上下载的测试图片‘elephant.jpg’
#-------------------------------------------from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
import os
import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = "6"
gpu_options = tf.GPUOptions(allow_growth=True)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
from keras.utils import plot_model
from matplotlib import pyplot as plt#【0】VGG19模型,加载预训练权重
base_model = VGG19(weights='imagenet')#【1】创建一个新model, 使得它的输出(outputs)是 VGG19 中任意层的输出(output)
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)
print(model.summary())                                 # 打印模型概况
plot_model(model,to_file = 'a simple convnet.png')     # 画出模型结构图,并保存成图片'''
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_conv4 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_conv4 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0
=================================================================
Total params: 10,585,152
Trainable params: 10,585,152
Non-trainable params: 0
_________________________________________________________________'''#【2】从网上下载一张图片,保存在当前路径下
img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224)) # 加载图片并resize成224x224#【3】将图片转化为4d tensor形式
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)#【4】数据预处理
x = preprocess_input(x) #去均值中心化,preprocess_input函数详细功能见注释
"""
def preprocess_input(x, data_format=None, mode='caffe'):Preprocesses a tensor or Numpy array encoding a batch of images.# Argumentsx: Input Numpy or symbolic tensor, 3D or 4D.data_format: Data format of the image tensor/array.mode: One of "caffe", "tf".- caffe: will convert the images from RGB to BGR,then will zero-center each color channel withrespect to the ImageNet dataset,without scaling.- tf: will scale pixels between -1 and 1,sample-wise.# ReturnsPreprocessed tensor or Numpy array.# RaisesValueError: In case of unknown `data_format` argument.
"""
#【5】提取特征
block4_pool_features = model.predict(x)
print(block4_pool_features.shape) #(1, 14, 14, 512)

示例图片:

参考: https://www.jianshu.com/p/cbd7176a7047

https://blog.csdn.net/dcrmg/article/details/81178424

keras: 用预训练的模型提取特征相关推荐

  1. 带你了解3类预训练语音模型预测方法

    摘要:在调研多篇论文后,笔者发现预训练语音模型的预测方法基本可以分为以下3类:<1>用前文预测当前及后文(自回归)<2> 随机mask 一些帧并预测 <3> 用两侧 ...

  2. 超50篇论文串联起从VQA到多模态预训练大模型的前世今生—Part 1

    文章简介 本文从视觉问答(VQA)任务出发,讲述了 2015 年任务的定义开始,接踵出现的各种多模态技术.从无注意力机制的深度学习模型,发展到天然适合注意力机制的多模态场景的模型,再到基于 Trans ...

  3. python怎么使用预训练的模型_Keras使用ImageNet上预训练的模型方式

    我就废话不多说了,大家还是直接看代码吧! import keras import numpy as np from keras.applications import vgg16, inception ...

  4. 全能型AI!用通用预训练感知模型处理多模态多任务!商汤西交港中文提出:Uni-Perceiver...

    关注公众号,发现CV技术之美 本文分享论文『Uni-Perceiver: Pre-training Unified Architecture for Generic Perception for Zer ...

  5. 通用视觉预训练大模型巡礼系列(一):UFO大模型

    ©PaperWeekly 原创 · 作者 | 张燚钧 单位 | 中国移动云能力中心 研究方向 | 预训练大模型 近来,以 ChatGPT 为代表的自然语言对话大模型,以及以 Stable Diffus ...

  6. NLP之PTM:自然语言处理领域—预训练大模型时代的各种吊炸天大模型算法概述(Word2Vec→ELMO→Attention→Transfo→GPT系列/BERT系列等)、关系梳理、模型对比之详细攻略

    NLP之PTM:自然语言处理领域-预训练大模型时代的各种吊炸天大模型算法概述(Word2Vec→ELMO→Attention→Transformer→GPT系列/BERT系列等).关系梳理.模型对比之 ...

  7. NeurIPS 2022 | 清华提出P2P:基于预训练图像模型的点到像素提示学习方法

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 在这里和大家分享一下我们被NeurIPS 2022录用的点云理解工 ...

  8. 新一代人工智能院士高峰论坛-视觉预训练大模型及其在智慧城市中的应用分论坛顺利举办

    2021年12月20日,新一代人工智能院士高峰论坛-视觉预训练大模型及其在智慧城市中的应用分论坛在深圳市人才研修院成功举办.  该论坛由鹏城实验室视觉智能研究所主办,邀请了企业界和学术界的技术大咖和资 ...

  9. 基于垂直领域语料,使用MaskLM任务预训练Bert模型

    项目介绍 使用Mask LM预训练任务来预训练Bert模型. 基于pytorch框架,训练关于垂直领域语料的预训练语言模型,目的是提升下游任务的表现. 代码及示例数据:https://github.c ...

最新文章

  1. Effective C++ 50条款
  2. PowerDesigner中为Oracle添加自增id
  3. 不良言论屏蔽方案探讨——自说自话方案
  4. 趣学python3(9)-range
  5. 通用权限管理系统组件 (GPM - General Permissions Manager) - 支持请求
  6. TableView的优化
  7. Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新
  8. lwip-1.4.1文档sys_arch翻译
  9. alios是安卓吗_华为洪蒙系统,阿里云OS,到底是不是安卓?
  10. Tokenview:当前Filecash网络目前总质押量约为627926枚FIC
  11. frameset标签设计页面
  12. SpringBoot, 启动类,使用「SpringBootApplication」标注
  13. 网络工程师Day3--PPPoE配置实验
  14. opencv如何隐藏窗口
  15. 【论文笔记】Video Transformer Network
  16. 电赛专题 |国一作品_线路负载及故障检测装置
  17. vue下拉框数据填充
  18. java休闲游戏背景音乐推荐_休闲益智类游戏背景音乐推荐
  19. luogu1378 油滴扩展 (深搜)
  20. iOS16新特性及开发适配

热门文章

  1. extjs 方法执行顺序_(软件工程)非结构化程序变为结构化程序的三种方法
  2. mysql开启中继日志,MySQL复制应用中继日志解析
  3. python怎样清除csv中的数据_使用d清除CSV文件中的数据
  4. 引入react文件报错_React Native常见问题(一)
  5. openmp配置指南_[z]OpenMP编程指南
  6. qlearning算法_通过OpenAI Gym编写第一个强化学习算法
  7. 华为服务器软件维护,服务器系统软件维护
  8. 设计模式 指令模式_指令设计模式
  9. python打印json_Python漂亮打印JSON
  10. 了解SQL INSERT INTO SELECT语句