预训练卷积神经网络

2023-05-16

一、综述

预训练网络(pretrained network)是一个保存好的网络,之前已在大型数据集(通常是大规模图像分类任务)上训练好。如果这个原始数据集足够大且足够通用,那么预训练网络学到的特征的空间层次结构可以有效地作为视觉世界的通用模型,即使这些新问题涉及的类别和原始任务完全不同。
假设有一个在 ImageNet 数据集(140 万张标记图像,1000 个不同的类别)上训练 好的大型卷积神经网络。ImageNet 中包含许多动物类别,其中包括不同种类的猫和狗,因此可 以认为它在猫狗分类问题上也能有良好的表现。
使用预训练网络有两种方法:特征提取(feature extraction)和微调模型(fine-tuning)。

二、特征提取

特征提取是使用之前网络学到的表示来从新样本中提取出有趣的特征。然后将这些特征输 入一个新的分类器,从头开始训练。

用于图像分类的卷积神经网络包含两部分:首先是一系列池化层和卷积层,最后是一个密集连接分类器。第一部分叫作模型的卷积基(convolutionalbase)。对于卷积神经网络而言,特征提取就是取出之前训练好的网络的卷积基,在上面运行新数据,然后在输出上面 训练一个新的分类器

为什么仅重复使用卷积基?我们能否也重复使用密集连接分类器?一般来说,应该避免这么做。原因在于卷积基学到的表示可能更加通用,因此更适合重复使用。卷积神经网络的特征图表示通用概念在图像中是否存在,无论面对什么样的计算机视觉问题,这种特征图都可能很有用。但是,分类器学到的表示必然是针对于模型训练的类别,其中仅包含某个类别出现在整张图像中的概率信息。此外,密集连接层的表示不再包含物体在输入图像中的位置信息。密集连接层舍弃了空间的概念

某个卷积层提取的表示的通用性(以及可复用性)取决于该层在模型中的深度。模型中更靠近底部的层提取的是局部的、高度通用的特征图(比如视觉边缘、颜色和纹理),而更 靠近顶部的层提取的是更加抽象的概念(比如“猫耳朵”或“狗眼睛”)。如果你的新数据集与原始模型训练的数据集有很大差异,那么最好只使用模型的前几层来做特征提取,而不是使用整个卷积基。

三、特征提取程序

1、在你的数据集上运行卷积基,将输出保存成硬盘中的Numpy 数组,然后用这个数据作 为输入,输入到独立的密集连接分类器中。
验证集损失从一开始就在增加,而验证集精度在90%上下摆动,说明从一开始就已经过拟合了,原因是由于训练数据太少了。因此,我添加了一个ImageDataGenerator以对图片进行增强处理,想要将增强图片输入进卷积基以得到增强的卷积基的输出,得增强处理后的图片达到8000张,但是情况却和增强之前一样,不知为何?推测是因为卷积基对这些增强前后的图片的预测输出都没有太大的区别

#加载vgg16的卷积基
from keras.applications import VGG16
conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(150, 150, 3))
conv_base.summary()

#定义将图片转换的函数
def extract_features(directory, sample_count, enhance=0):
    features = np.zeros(shape=(sample_count, 4, 4, 512))
    labels = np.zeros(shape=(sample_count))
    if enhance:
        generator = train_datagen.flow_from_directory(
                directory,
                target_size=(150, 150),
                batch_size=batch_size,
                class_mode='binary')
    else:
        generator = test_datagen.flow_from_directory(
                directory,
                target_size=(150, 150),
                batch_size=batch_size,
                class_mode='binary')
    i = 0
    for inputs_batch, labels_batch in generator:
        features_batch = conv_base.predict(inputs_batch)
        features[i * batch_size : (i + 1) * batch_size] = features_batch
        labels[i * batch_size : (i + 1) * batch_size] = labels_batch
        i += 1
        if i * batch_size >= sample_count:
            break
    return features, labels

train_features , train_labels = extract_features(train_dir, 2000)
validation_features , validation_labels = extract_features(validation_dir, 1000)
test_features , test_labels = extract_features(test_dir, 1000)
train_features = np.reshape(train_features, (len(train_features), 4 * 4 * 512))
#将卷积基的输出整形
test_features = np.reshape(test_features, (len(test_features), 4 * 4 * 512))
validation_features = np.reshape(validation_features, (len(validation_features), 4 * 4 * 512))

#定义全连接层部分的模型
model = models.Sequential()
model.add(layers.Dense(256, activation='relu', input_dim=4*4*512))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
history = model.fit(train_features, train_labels, 
                        epochs=30, 
                        batch_size=20, 
                        validation_data=(validation_features, validation_labels))

2、在顶部添加 Dense 层来扩展已有模型,并在输入数据上端到端地运行整个模型。
这样可以使用数据增强,因为每个输入图像进入模型时都会经过卷积基。 但出于
同样的原因,这种方法的计算代价比第一种要高很多。

书上的测试该方式可以达到96%,但是测试中只达到90%精度,损失智在一定幅度内摆动
#搭建模型并将卷积集设置成不可训练
#利用增强的训练集训练模型即可
from keras import layers, models
from keras.applications import VGG16
conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(150, 150, 3))


model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()
#%%
len(model.trainable_weights)
conv_base.trainable = False
len(model.trainable_weights)

四、模型微调

    微调是指将其顶部的几层“解冻”,并将这解冻的几层和新增加的部分联合训练。之所以叫作
微调,是因为它只是略微调 整了所复用模型中更加抽象的表示,以便让这些表示与手头的问题更
加相关。
    冻结VGG16 的卷积基是为了能够在上面训练一个随机初始化的分类器。同理,只有上面的
分类器已经训练好了,才能微调卷积基的顶部几层。
    该方式与书籍的测试结果相同,达到97%的准确率
   微调网络的步骤如下。 
(1) 在已经训练好的基网络(base network)上添加自定义网络。 
(2) 冻结基网络。
(3) 训练所添加的部分。 
(4) 解冻基网络的一些层。 
(5) 联合训练解冻的这些层和添加的部分。 
#解冻基网络的高层次部分
conv_base.trainable = True 
set_trainable = False 
for layer in conv_base.layers:
     if layer.name == 'block5_conv1':
         set_trainable = True
     if set_trainable:
         layer.trainable = True
     else:
         layer.trainable = False 
  
 #使用学习率非常小的 RMSProp 优化器来实现。之所以让学习率很小,
 #是因为对于微调的三层表示,我们希望其变化范围不要太大。太大的
 #权重更新可 能会破坏这些表示。 
model.compile(loss='binary_crossentropy',
        optimizer=optimizers.RMSprop(lr=1e-5),
        metrics=['acc'])   

五、

如果损失没有降低,那么精度怎么能保持稳定或提高呢?答案很简单:图中展示的是逐点(pointwise)
损失值的平均值,但影响精度的是损失值的分布,而不是平均值,因为精度是 模型预测的类别概率的二
进制阈值。即使从平均损失中无法看出,但模型也仍然可能在改进。 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预训练卷积神经网络 的相关文章

  • bsp_uart_fifo

    bsp uart fifo h 模块名称 串口中断 43 FIFO驱动模块 文件名称 bsp uart fifo h 说 明 头文件 ifndef BSP USART FIFO H define BSP USART FIFO H
  • 记一次自镜像Docker启动失败ubuntu 安装tini

    使用ubuntu18 04打包镜像启动失败报错信息 xff1a bin sh 1 tini not found 需要安装tini 而ubuntu本身软件源没有这个软件包 apt install y tini 报错 Unable to loc
  • Bluerov电池充电参数及过放补救方法

    Bluerov电池 1 Bluerov电池2 容量3 C rating xff08 放电倍率 xff09 4 充电电流5 充电注意事项及操作说明6 过放使用补救方法 xff08 但电池损耗已不可逆转 xff09 方法步骤 xff1a 1 B
  • Android Parcelable

    一 xff1a 是什么 xff1f Paracelable是android自己的实现序列化的接口 是anroid推荐使用的 那么什么事序列化呢 xff1f 简单来说就是将对象转换为可以传输的二进制流 二进制序列 的过程 这样我们就可以通过序
  • 字符串和字符串结束标志

    在C语言中 xff0c 是将字符串作为字符数组来处理的 例如 xff0c 如下程序 xff1a include lt stdio h gt int main char c 15 61 39 I 39 39 39 39 a 39 39 m 3
  • 单目相机标定方法总结

    单目相机标定的常用方法 xff0c 这里主要总结一下ROS和matlab标定工具箱 ROS相机标定 链接 xff1a https blog csdn net learning tortosie article details 7990125
  • Prometheus之修炼篇

    Prometheus之修炼篇 官方文档 xff1a https prometheus io 中文文档 xff1a 非官方 xff1a https songjiayang gitbooks io prometheus content 一 入门
  • QT视频播放不出来,报错 DirectShowPlayerService::doRender: Unresolved error code 80040266——没有安装视频解码器

    出错1 没有安装视频解码器 DirectShowPlayerService doRender Unresolved error code 0x80040266 出错2 文件路径不对或者文件名是中文的 DirectShowPlayerServ
  • ROS(1)编写第一个ROS程序(创建工作空间workspace和功能包package)

    一 先从三个方面去理解ROS xff1a xff08 自己查 xff0c 不详表 xff09 ROS是什么 xff0c 为什么使用ROS xff0c 如何使用ROS ROS xff08 Robot Operating System xff0
  • jetson nano TF卡镜像复制

    很重要的第一点 xff0c TF卡一定要进行格式化 xff0c 再进行其他操作 1 使用USB xff12 xff10 2 在win10无法将TF卡格式化成FAT32时 xff0c 使用DiskGenius xff0c 将TF卡格式化成FA
  • C++里数组名+1和数组名的地址+1的区别

    C C 43 43 里面的数组名字会退化为指针 xff0c 所以数组名a实际指的是数组的第一个元素的地址 而数组名作为指针来讲有特殊性 xff0c 它正在它所指向的内存区域中 xff0c amp a的值和a的数值是相同的 xff08 可以输
  • AD软件之模块化原理图

    首先我们创建两个原理图文件 然后我们在Sheet2 SchDoc里放置一个页面符并双击绿色的方框 选择目标文件 我们选择我们刚才创建的Sheet4 SchDoc 然后在 视图 gt 面板 gt Navigator选项 里点一下交互式导航 就
  • c语言中判断一个字符串是否包含另一个字符串

    1 使用库函数 string h strstr函数 函数名 strstr 功 能 在串中查找指定字符串的第一次出现 用 法 char strstr char str1 char str2 说明 xff1a 返回指向第一次出现str2位置的指
  • TCP协议-握手与挥手

    认识TCP协议 TCP全称为 传输控制协议 xff0c 这是传输层的一个协议 xff0c 对数据的传输进行一个详细的控制 特点 xff1a 面向字节流安全可靠面向连接 TCP协议段格式 源端口号与目的端口号 xff1a 这里与UDP的一样
  • C语言volatile的作用及使用场景介绍

    简介 volatile 先从基础的知识说起吧 xff0c 这样也有个来龙去脉 我们都知道 xff0c 程序运行后 xff0c 程序的数据都会被从磁盘加载到内存里面 xff08 主存 xff09 而当局部的指令被执行的时候 xff0c 内存中
  • SNMPv3报文

    相应的数字表示 xff08 对象标识符OID xff0c 唯一标识一个MIB对象 xff09 为 xff1a 1 3 6 1 2 1 4 3 图2 MIB树结构 当网络管理协议在报文中使用MIB变量时 xff0c 每个变量名后还要加一个后缀
  • 详解C语言中volatile关键字

    volatile提醒编译器它后面所定义的变量随时都有可能改变 xff0c 因此编译后的程序每次需要存储或读取这个变量的时候 xff0c 都会直接从变量地址中读取数据 如 果没有volatile关键字 xff0c 则编译器可能优化读取和存储
  • EtherCAT从站学习笔记——2.4通信模式

    在实际的控制系统中 xff0c 应用程序之间一般有两种类型的数据交换形式 xff1a 时间关键数据 time critical 和非时间关键数据 non time critial 时间关键表示特定的动作必须在确定的时间内完成或处理 xff0
  • 在linux下利用ls命令进行模糊查找

    如上图 xff0c 我们当前路径下有三个文件 xff0c 分别为helloworld c以及helloworld和1 c xff0c 直接输入命令ls则显示所有文件 xff0c 我们可以利用ls 加 的方向进行模糊查找 输入ls 目录名 形

随机推荐

  • 树莓派第一次开机自动连接WIFI(不用显示屏方法)

    当我们把树莓派系统镜像烧录到SD卡之后 xff0c 我们在windows看到的TF卡变成了空间很小的名为boot的盘 xff0c 我们在此目录下新建一个名为wpa supplicant conf空白文件 xff0c 并在其中加入以下代码 c
  • linux交叉编译时报错 libfreetype.so: file not recognized: File format not recognized

    root 64 ubuntu home linuxsystemcode 04th print info arm none linux gnueabi gcc finput charset 61 GBK o example1 example1
  • 神经网络epoch和batch的粗浅理解

    关于神经网络epoch和batch的理解 理解粗浅 xff0c 仅为个人想法 xff0c 提前感谢指正 epoch 一个epoch代表全部数据进入网络一次 xff0c 这个时候 xff0c 整个网络结构只对这批数据全部走完一次 xff0c
  • 目标检测与位姿估计(二十三):OpenCV+Aruco完成目标检测

    一份识别图像图像中所有Aruco的代码 include lt opencv2 core core hpp gt include lt opencv2 imgproc imgproc hpp gt include lt opencv2 hig
  • 随记(2):PP-Tracking工具

    目标跟踪任务意义 需求 xff1a 自动驾驶 智慧城市 安防领域面向车辆 行人 飞行器等快速运行的物体实时跟踪及分析 算法优势 xff1a 单纯的目标检测算法只能输出目标的定位 43 分类 xff0c 无法对移动的目标具体的运动行为及运动特
  • 【ROS&GAZEBO】多旋翼无人机仿真(一)——搭建仿真环境

    ROS amp GAZEBO 多旋翼无人机仿真 xff08 一 xff09 搭建仿真环境 ROS amp GAZEBO 多旋翼无人机仿真 xff08 一 xff09 搭建仿真环境 ROS amp GAZEBO 多旋翼无人机仿真 xff08
  • 【ROS&GAZEBO】多旋翼无人机仿真(三)——自定义多旋翼模型

    ROS amp GAZEBO 多旋翼无人机仿真 xff08 一 xff09 搭建仿真环境 ROS amp GAZEBO 多旋翼无人机仿真 xff08 二 xff09 基于rotors的仿真 ROS amp GAZEBO 多旋翼无人机仿真 x
  • 当使用CUBEMX,STM32F429阿波罗开发板的PCF8574与1-Wire冲突的解决办法。

    hello 大家好 xff01 距离上次写博客还是上半年呢 这几个月做了很多实验 xff0c 不过都很懒 xff0c 一直没有写上来 准备慢慢补回来 下面是我在使用原子哥的STM32F429的开发板做温度传感器项目的小实验时遇到的问题 1
  • 【ROS&GAZEBO】解决“is neither a launch file in package ”的问题

    这两天有小伙伴问到在安装完rotors后出现如下问题 xff1a 这个问题其实是ros环境没有配置好 xff0c 运行下面的命令 xff0c 将catkub ws加入ros的工作空间 span class token function mk
  • 【ROS&GAZEBO】多旋翼无人机仿真(七)——四元数姿态控制

    ROS amp GAZEBO 多旋翼无人机仿真 xff08 一 xff09 搭建仿真环境 ROS amp GAZEBO 多旋翼无人机仿真 xff08 二 xff09 基于rotors的仿真 ROS amp GAZEBO 多旋翼无人机仿真 x
  • 【DRONECAN】(一)介绍

    DRONECAN 前言 笔者最近因为项目需要用到CAN通信 xff0c 所以研究了一下飞控上基于CAN的协议 xff0c 目前在Ardupilot和PX4中用的是DRONECAN xff0c DRONECAN是基于CAN的通信协议 xff0
  • 普通人对AI的看法

    就发展前景来看 xff0c 人工智能无疑将是现阶段与今后很长时间内的全球性热点 这是一个可以预见性的历史潮流 xff0c 无可阻挡 xff0c 一旦它出现一定会对现代互联网的结构会产 生颠覆性的改变 它将重新定义现代互联网的理念 xff0c
  • java+postgis实现根据两点生成模拟轨迹gps数据

    java 43 postgis实现根据两点生成模拟轨迹gps数据 文章目录 java 43 postgis实现根据两点生成模拟轨迹gps数据前言一 实现流程1 请求参数2 功能流程3 postgis重要使用函数介绍4 生成的GPS模拟轨迹点
  • Docker更新springboot容器镜像

    下载安装partainer 拉取镜像 docker pull portainer portainer ce 运行容器 docker run d p 9000 9000 v var run docker sock var run docker
  • AUTOSAR简介

    1 简介 AUTOSAR全称为 AUTomotive Open System ARchitecture xff0c 译为 汽车开放系统体系结构 xff1b AUTOSAR是一家由汽车电子 半导体和软件行业的汽车制造商 供应商 服务提供商等公
  • 基于sklearn的分类与回归基础总结

    一 分类 一 数据类型 1 python自带类型 span class token builtin list span span class token comment 列表 span span class token builtin tu
  • 回归模型 Boston房价预测

    一 加载数据集 将取值范围差异很大的数据输入到神经网络中 xff0c 这是有问题的 网络可能会自动适应这种取值范围不同的数据 xff0c 但学习肯定变得更加困难 对于这种数据 xff0c 普遍采用的最佳实践是对每个特征做标准化 xff0c
  • 卷积神经网络 猫狗识别

    一 卷积神经网络搭建 搭建框架 xff0c 需要使用卷积层和池化层 span class token keyword from span keras span class token keyword import span models s
  • Matlab学习笔记

    PART 0 xff1a 绪论 2018年9月11日 16 54 参考书籍 理论教程 MATLAB与计算方法 谢进 xff0c 李大美主编 武汉大学出版社 图书馆编号TP312MAX321 实践教程 MATLAB基础与运用 熊庆如主编 机械
  • 预训练卷积神经网络

    一 综述 预训练网络 xff08 pretrained network xff09 是一个保存好的网络 xff0c 之前已在大型数据集 xff08 通常是大规模图像分类任务 xff09 上训练好 如果这个原始数据集足够大且足够通用 xff0