首页 > 其他分享 >深度学习笔记3:使用预训练模型之特征提取

深度学习笔记3:使用预训练模型之特征提取

时间:2023-12-07 14:59:49浏览次数:30  
标签:loss None features keras labels 笔记 test 深度 特征提取

  我们在小型图像数据集上做深度学习时,一种高效且实用的方法是采用预训练模型。预训练模型,指的是在大型数据集上预先训练好的模型。如果原始数据集具有足够的规模和通用性,那么预训练模型所学习到的特征的空间层次结构可以被视为视觉世界的通用模型。与许多早期的浅层学习方法相比,这种在不同问题之间移植特征的能力是深度学习的重要优势,它使得深度学习在处理数据量较小的问题时表现得尤为出色。
  对于小型图像数据集,使用预训练模型的优势在于可以利用已有的大规模数据集的训练成果,从而避免从头开始训练模型。这种方法可以帮助我们充分利用深度学习中丰富的特征表示能力,从而在资源有限的情况下取得良好的性能。此外,预训练模型还可以作为新任务的起点,通过微调来适应新的任务需求。这种微调的方法可以有效地利用已有的知识,并针对新的任务进行适应性的调整。本文我们采用VGG16 模型,这是一个内置于 Keras 中的模型,可以从 keras.applications模块中导入

将 VGG16 卷积基实例化

from tensorflow import keras
conv_base = keras.applications.vgg16.VGG16(
    weights="imagenet",    include_top=False,    input_shape=(180, 180, 3))
>>> conv_base.summary()
Model: "vgg16"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 input_1 (InputLayer)        [(None, 180, 180, 3)]     0

 block1_conv1 (Conv2D)       (None, 180, 180, 64)      1792

 block1_conv2 (Conv2D)       (None, 180, 180, 64)      36928

 block1_pool (MaxPooling2D)  (None, 90, 90, 64)        0

 block2_conv1 (Conv2D)       (None, 90, 90, 128)       73856

 block2_conv2 (Conv2D)       (None, 90, 90, 128)       147584

 block2_pool (MaxPooling2D)  (None, 45, 45, 128)       0

 block3_conv1 (Conv2D)       (None, 45, 45, 256)       295168

 block3_conv2 (Conv2D)       (None, 45, 45, 256)       590080

 block3_conv3 (Conv2D)       (None, 45, 45, 256)       590080

 block3_pool (MaxPooling2D)  (None, 22, 22, 256)       0

 block4_conv1 (Conv2D)       (None, 22, 22, 512)       1180160

 block4_conv2 (Conv2D)       (None, 22, 22, 512)       2359808

 block4_conv3 (Conv2D)       (None, 22, 22, 512)       2359808

 block4_pool (MaxPooling2D)  (None, 11, 11, 512)       0

 block5_conv1 (Conv2D)       (None, 11, 11, 512)       2359808

 block5_conv2 (Conv2D)       (None, 11, 11, 512)       2359808

 block5_conv3 (Conv2D)       (None, 11, 11, 512)       2359808

 block5_pool (MaxPooling2D)  (None, 5, 5, 512)         0

=================================================================
Total params: 14714688 (56.13 MB)
Trainable params: 14714688 (56.13 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
>>>

  我们将在训练集、验证集和测试集上调用 conv_base 模型的 predict() 方法,将特征提取为 NumPy 数组。

提取 VGG16 的特征和对应的标签


import pathlib


batch_size = 32
img_height = 180
img_width = 180


new_base_dir = pathlib.Path('C:/Users/wuchh/.keras/datasets/dogs-vs-cats-small')


train_dataset = keras.preprocessing.image_dataset_from_directory(
  new_base_dir / 'train' ,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size
)



validation_dataset = keras.preprocessing.image_dataset_from_directory(
  new_base_dir / 'train' ,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size
)



test_dataset = keras.preprocessing.image_dataset_from_directory(
  new_base_dir / 'test' ,
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size
)



提取 VGG16 的特征和对应的标签

import numpy as np
def get_features_and_labels(dataset):    
    all_features =[]    
    all_labels = []
    i=0
    for images, labels in dataset:   
        print("batch No:{0}".format(i+1))
        i+=1
        preprocessed_images = keras.applications.vgg16.preprocess_input(images)
        features =conv_base.predict(preprocessed_images)
        all_features.append(features)        
        all_labels.append(labels)
    return np.concatenate(all_features), np.concatenate(all_labels)

    
    
train_features, train_labels = get_features_and_labels(train_dataset)
val_features, val_labels = get_features_and_labels(validation_dataset)
test_features, test_labels = get_features_and_labels(test_dataset)

定义并训练密集连接分类器

inputs = keras.Input(shape=(5, 5, 512))
x = layers.Flatten()(inputs)   
x = layers.Dense(256)(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(loss="binary_crossentropy",optimizer="rmsprop",metrics=["accuracy"])


训练模型

callbacks = [keras.callbacks.ModelCheckpoint(filepath="feature_extraction.model",save_best_only=True,monitor="val_loss")]
history = model.fit(train_features, train_labels,epochs=20,validation_data=(val_features, val_labels),callbacks=callbacks) 

绘制训练结果

import matplotlib.pyplot as plt
acc = history.history["accuracy"]
val_acc = history.history["val_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, "bo", label="Training accuracy")
plt.plot(epochs, val_acc, "b", label="Validation accuracy")
plt.title("Training and validation accuracy")
plt.legend()
plt.figure()
plt.plot(epochs, loss, "bo", label="Training loss")
plt.plot(epochs, val_loss, "b", label="Validation loss")
plt.title("Training and validation loss")
plt.legend()
plt.show()

 

测试模型分类精度

test_model = keras.models.load_model("feature_extraction.model")
test_loss, test_acc = test_model.evaluate(test_features, test_labels)
print(f"Test accuracy: {test_acc:.3f}")

 

>>> test_model = keras.models.load_model("feature_extraction.model")
>>> test_loss, test_acc = test_model.evaluate(test_features, test_labels)
32/32 [==============================] - 0s 2ms/step - loss: 3.5562 - accuracy: 0.9710
>>> print(f"Test accuracy: {test_acc:.3f}")
Test accuracy: 0.971
>>>

 

总之,使用预训练模型是处理小型图像数据集的有效方法。它利用了深度学习中丰富的特征表示能力,以及在不同任务之间迁移知识的优势。这种方法不仅可以提高模型的性能,而且可以节省训练时间和计算资源。 

 

标签:loss,None,features,keras,labels,笔记,test,深度,特征提取
From: https://www.cnblogs.com/haozi0804/p/17785097.html

相关文章

  • 深度学习3D网络---PointNet
    常见的3D数据表示方式有点云、多视图、体素、mesh网格等。PointNet是直接处理点云数据的网络,可以实现对点云的分类和分割,其首页地址为:http://stanford.edu/~rqi/pointnet/。主要从解决点云的无序性和保证旋转一致性两个方向出发,提出了以点云作为输入的分类网络和分割网络。一......
  • Request 爬虫的 SSL 连接问题深度解析
    SSL连接简介SSL(SecureSocketsLayer)是一种用于确保网络通信安全性的加密协议,广泛应用于互联网上的数据传输。在数据爬取过程中,爬虫需要与使用HTTPS协议的网站进行通信,这就牵涉到了SSL连接。本文将深入研究Request爬虫中的SSL连接问题,并提供解决方案以应对各种情况。问题......
  • 硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析
    前言  前面输出了HDMI,LVDS,MIPI-DSI,这里还有一个常用的显示接口就是VGA了,这个用的不多了,一般板子都是hdmi了。  本篇分析底板VGA电路。<br>VGA接口  VGA(VideoGraphicsArray)视频图形阵列是IBM于1987年提出的一个使用模拟信号的电脑显示标准。VGA接口即电脑采用VGA标准输......
  • 易基因:人早期胚胎发育的表观遗传调控(染色质重塑+组蛋白修饰+DNA甲基化)|深度综述
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 哺乳动物发育研究促进了对协调胚胎发生遗传、表观遗传和细胞过程的理解,并揭示了对人类胚胎发生特异性新见解。最近研究生成了人类早期胚胎发生的第一个表观遗传学图谱,激发了关于表观遗传学重编程、细胞命运调控以......
  • 组队学习-学习笔记P5
    组队学习-学习笔记P5本文是学习b站up主二次元的datawhale发布的聪明办法学python系列视频后记录的一些学习笔记部分内容引用于聪明办法学python视频调试Debugging编程哲学机器永远是对的(出现问题一定是人的问题)未测代码永远是错的(很有可能bug出现在你认为绝对不会出......
  • MongoDB (操作数据库,操作集合,操作文档)的笔记
    https://www.bilibili.com/video/BV1gV411H7jN/?spm_id_from=333.999.0.0&vd_source=92305fa48ea41cb7bedb3ab5e056d42db站mongodb的视频链接。1,MongoDB是什么?  2,MongoDB和Redis的区别2.1,内存管理机制 2.2,支持的数据结构 2.3,不适用场景3,可视化工具Robomongomon......
  • 12 6 刻意练习阅读笔记
    第3章心理表征偶然的盲棋大师俄罗斯国际象棋特级大师亚历山大-阿廖欣,与当地26位优秀的国际象棋棋手盲棋对战,选手不需要盲下。赢了17盘,输了5盘,和了4盘。上学的时候喜欢下棋,不允许将棋盘带到学校,只能在课堂上通过草图进行模拟。慢慢的他发现自己可以不用草图,完全凭借记忆记住整......
  • STM32学习笔记_点灯(基于库函数方式)
    1.使能外设时钟输入:RCC_APB2PeriphClockCmd函数,查看函数定义,根据函数定义填写参数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);2.配置端口模式输入函数GPIO_Init,跳转到函数定义,查看函数定义得知函数体的第二个参数是结构体,先定义结构体并且填写结构体的各个参数,然后填写......
  • [机器学习复习笔记] 机器学习基础
    机器学习基础1.基础概念和术语样本(\(\text{sample}\))/实例(\(\text{instance}\))我们获得的数据集中的一条数据,被称为一个样本(\(\text{sample}\))/实例(\(\text{instance}\)),在不存在数据缺失的情况下,所有样本应该具有相同的结构。特征(\(\text{feature}\))记录样本的某......
  • MySQL基础命令笔记
    MySQL基础命令笔记上学期间学习记录的笔记,放这里方便查阅。--创建数据库--CREATE创建;DATABASE数据库;CREATEDATABASEstuinfo--默认字符集DEFAULTCHARACTERSETutf8mb4--排序规则DEFAULTCOLLATEutf8mb4_general_ci;--显示当前服务器下,所有数据库SHOWDA......