Keras:使用预训练网络的bottleneck特征

Keras:使用预训练网络的bottleneck特征使用预训练网络的 bottleneck 特征 bottleneck 特征通过 fromkeras applications vgg16importV utilsimportp modelmodel VGG16 include top True weights imagenet model summary plot model m

通过

from keras.applications.vgg16 import VGG16 from keras.utils import plot_model model = VGG16(include_top=True, weights='imagenet') model.summary() plot_model(model, to_file='VGG16.png')

可以看到VGG16的网络结构为:

_________________________________________________________________ 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)  _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256)  _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256)  _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256)  _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512)  _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512)  _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512)  _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512)  _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512)  _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512)  _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096)  _________________________________________________________________ fc2 (Dense) (None, 4096)  _________________________________________________________________ predictions (Dense) (None, 1000) ================================================================= Total params: 138,357,544 Trainable params: 138,357,544 Non-trainable params: 0 _________________________________________________________________

这里写图片描述

当我们需要使用VGG16的卷积部分时,我们将全连接以上的部分抛掉.即另

VGG16(include_top=True, weights='imagenet')
train\  0\  1\ validation\  0\  1\
import numpy as np test = np.load('bottleneck_features_train.npy') print (test.shape)

生成训练集与验证集的bottleneck特征数据:

#!/usr/bin/python # coding:utf8 from keras.preprocessing.image import ImageDataGenerator import numpy as np from keras.applications.vgg16 import VGG16 # include_top:是否保留顶层的3个全连接网络 # 'imagenet'代表加载预训练权重 model = VGG16(include_top=False, weights='imagenet') # 加载pre-model的权重 model.load_weights('vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5') datagen = ImageDataGenerator(rescale=1./255) # 训练集图像生成器,以文件夹路径为参数,生成经过数据提升/归一化后的数据 train_generator = datagen.flow_from_directory('train', target_size=(150, 150), batch_size=32, class_mode=None, shuffle=False) # 验证集图像生成器 validation_generator = datagen.flow_from_directory('validation', target_size=(150, 150), batch_size=32, class_mode=None, shuffle=False) # 得到bottleneck feature # 使用一个生成器作为数据源预测模型,生成器应返回与test_on_batch的输入数据相同类型的数据 bottleneck_features_train = model.predict_generator(train_generator, steps=200) print (bottleneck_features_train) # steps是生成器要返回数据的轮数 # 将得到的特征记录在numpy array里 np.save(open('bottleneck_features_train.npy', 'w'), bottleneck_features_train) bottleneck_features_validation = model.predict_generator(validation_generator, steps=80) # 一个epoch有800张图片,验证集 np.save(open('bottleneck_features_validation.npy', 'w'), bottleneck_features_validation)

然后训练我们的全连接网络,这里由于之前我们得到的训练集与测试集的bottleneck特征分别有200*30=6000,80*30=2400组,因此对应labels分别设为:

train_labels = np.array([0]*3000 + [1]*3000)
validation_labels = np.array([0]*1200 + [1]*1200)

然后将得到的数据载入,开始训练全连接网络:

#!/usr/bin/python # coding:utf8 # fine-tune网络的后面几层.Fine-tune以一个预训练好的网络为基础,在新的数据集上重新训练一小部分权重 from keras.models import Sequential from keras.layers import Dropout, Flatten, Dense import numpy as np train_data = np.load(open('bottleneck_features_train.npy')) train_labels = np.array([0]*3000 + [1]*3000) print (train_labels) validation_data = np.load(open('bottleneck_features_validation.npy')) validation_labels = np.array([0]*1200 + [1]*1200) model = Sequential() model.add(Flatten(input_shape=train_data.shape[1:])) model.add(Dense(256, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) model.fit(train_data, train_labels, epochs=5, batch_size=32, validation_data=(validation_data,validation_labels)) model.save_weights('bottleneck_fc_model.h5') 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228130.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:45
下一篇 2026年3月16日 下午7:45


相关推荐

  • 最新版PhpStorm 2017激活办法

    最新版PhpStorm 2017激活办法最新版 PhpStorm2017 正式版改进了 PHP7 支持 改进代码完成功能 PhpStorm 绝对是 PHP 开发最好的开发工具 phpstorm 已经升级到 2017 1 原注册码失效 比如 2017 1 2 注册方法 注册时选择 Licenseserve 输入 nbsp http idea lanyus com 已被封杀 或 http idea qinxi1992 cn 等 nbsp 第一

    2026年3月26日
    3
  • mysql修改字段名_mySql 修改字段名

    mysql修改字段名_mySql 修改字段名主键 altertableta field idint 5 unsigneddefa increment addprimaryke new field id 增加一个新列 altertablet2 altertablein

    2026年3月18日
    2
  • 什么是敏捷开发?

    什么是敏捷开发?敏捷开发 Agile 是一种以人为核心 迭代 循序渐进的开发方法 在敏捷开发中 软件项目的构建被切分成多个子项目 各个子项目的成果都经过测试 具备集成和可运行的特征 简单地来说 敏捷开发并不追求前期完美的设计 完美编码 而是力求在很短的周期内开发出产品的核心功能 尽早发布出可用的版本 然后在后续的生产周期内 按照新需求不断迭代升级 完善产品 是谁这么厉害 提出了敏捷开发思想 是一位名叫 Ma

    2026年3月18日
    2
  • php中的header函数_contenttype是什么意思

    php中的header函数_contenttype是什么意思这篇文章介绍的内容是关于PHP中php设置header函数之content-type,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下//定义编码header(‘Content-Type:text/html;charset=utf-8’);//Atomheader(‘Content-type:application/atom+xml’);//CSSheader(‘Content…

    2022年8月24日
    10
  • 3D点云实例分割_3d点云标注软件

    3D点云实例分割_3d点云标注软件3D点云实例分割3D语义分割区分场景中各类对象,3D实例分割区分场景中各类别中的各种个体。近两年来,3D实例分割的关注度越来越高,相应的方法也被接连提出。众多方法的思想主要分为两类:基于候选区域的实例分割(proposal-based)和免候选区域的实例分割(proposal-free)。其中,proposal-based先获取场景中的感兴趣的候选区域,如:3Dboundingboxes等…

    2022年8月23日
    13
  • 开启wallpaper engine的时候 很卡_wallpaper用独显

    开启wallpaper engine的时候 很卡_wallpaper用独显轻松一步解决wallpaperengine小红车卡顿鼠标延迟问题

    2025年10月26日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号