• Keras实现——预训练卷积神经网络(VGG16)


    一、预训练网络

    是一个保存好的网络,之前已在大型数据集(通常是大规模图像分类任务)上训练好。通过预训练网络学到的特征在不同问题之间的可移植性,在深度学习对小数据问题非常有效。使用预训练网络有两种方法:特征提取(feature extraction)和微调模型(fine-tuning)。

     二、特征提取

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

    三、VGG16架构

    1.将VGG16卷积基实例化

    1. #将VGG16卷积基实例化
    2. from keras.applications import VGG16
    3. conv_base=VGG16(weights='imagenet',include_top=False,input_shape=(64,64,3))

    这里向架构中传入了三个参数

    1.weights:模型初始化的权重检查点。

    2.include——top:是指定模型最后是否包含密集连接分类器。

    3.input——shape:输入网络中图像的形状。

    2.VGG16卷积基的详细架构 

    conv_base.summary()

    结果如图所示:

     最后输出的特征图形状为(2,2,512)。

    接下来有两种方法:

    1.在数据集上运行卷积基将输出保存成硬盘中的Numpy数组,然后利用这个数据做为输入,输入到独立的密集连接分类器中这种方法速度快,计算代价低,由于这个原因这种方法不允许用数据增强。

    2.这种方法的代码过程如下:

    1.构造卷积基特征提取

    1. #构造卷积基特征提取
    2. import os
    3. import numpy as np
    4. from keras.preprocessing.image import ImageDataGenerator
    5. def extract_features(directory,sample_count):
    6. features=np.zeros(shape=(sample_count,2,2,512))
    7. labels=np.zeros(shape=(sample_count))
    8. generator=datagen.flow_from_directory(
    9. directory,
    10. target_size=(64,64),
    11. batch_size=batch_size,
    12. class_mode='binary')
    13. i=0
    14. for inputs_batch,labels_batch in generator:
    15. features_batch=conv_base.predict(inputs_batch)
    16. features[i*batch_size:(i+1)*batch_size]=features_batch
    17. labels[i*batch_size:(i+1)*batch_size]=labels_batch
    18. i+=1
    19. if i*batch_size>=sample_count:
    20. break
    21. return features,labels

    2.定义并训练密集连接器

    1. from keras import models
    2. from keras import layers
    3. from keras import optimizers
    4. model=models.Sequential()
    5. model.add(layers.Dense(128,activation='relu',input_dim=2*2*512))
    6. model.add(layers.Dropout(0.5))
    7. model.add(layers.Dense(1,activation='sigmoid'))
    8. model.compile(optimizer=optimizers.RMSprop(lr=2e-5),loss='binary_crossentropy',metrics=['acc'])
    9. history=model.fit(train_features,train_labels,epochs=100,batch_size=100,validation_data=(validation_features,validation_labels))

    2.在顶部添加Dense层来扩展已有模型(即conv_base),并输入数据运行整个模型。这样我们还可以用数据增强。

    1.在卷积基上添加一个密集链接分类器

    1. from keras import models
    2. from keras import layers
    3. model=models.Sequential()
    4. model.add(conv_base)
    5. model.add(layers.Flatten())
    6. model.add(layers.Dense(256,activation='relu'))
    7. model.add(layers.Dense(1,activation='sigmoid'))

    2.模型架构如下所示:

    VGG16的卷积基有14714688个参数,非常多。在编译和训练模型前,一定要‘冻结’卷积基。冻结 

     (freeze)一个或多个层是指在训练过程中保持其权重不变。如果不这样做,那么卷积基之前学到的表示将会发生改变。我们需要这样去冻结,代码如下:

    1. #冻结
    2. conv_base.trainable=False

    3.利用冻结的卷积基端到端地训练模型增加了数据增强,代码如下:

    1. from keras.preprocessing.image import ImageDataGenerator
    2. from keras import optimizers
    3. train_datagen=ImageDataGenerator(
    4. rescale=1./255,
    5. rotation_range=40,
    6. width_shift_range=0.2,
    7. height_shift_range=0.2,
    8. shear_range=0.2,
    9. zoom_range=0.2,
    10. horizontal_flip=True,
    11. fill_mode='nearest'
    12. )
    13. test_datagen=ImageDataGenerator(rescale=1./225)
    14. train_generator=train_datagen.flow_from_directory(
    15. train_dir,
    16. target_size=(64,64),
    17. batch_size=80,
    18. class_mode='binary')
    19. validation_generator=test_datagen.flow_from_directory(
    20. validation_dir,
    21. target_size=(64,64),
    22. batch_size=50,
    23. class_mode='binary')

    剩下模型编译和训练代码就不赘述了。 

  • 相关阅读:
    UE5、CesiumForUnreal实现瓦片坐标信息图层效果
    2024.2.27 模拟实现 RabbitMQ —— 网络通信设计(客户端)
    word目录怎么自动生成?用这个方法,快速自动生成
    于51单片机的安全带(拉力,高度,紧急)原理图、流程图、物料清单、仿真图、源代码
    【机器学习基础】K-Means聚类算法
    链表面试常见题
    如何完美解决 IDE升级后启动报错 Internal error. Please refer to https://jb.gg/ide/critical-startup-errors
    etcd实现大规模服务治理应用实战
    数据挖掘比赛比较基础的baseline
    微服务05-Docker基本操作
  • 原文地址:https://blog.csdn.net/m0_72662900/article/details/126562165