深度学习实战:定制化智能狗门的迁移学习之旅

引言

在深度学习领域,迁移学习是一种强大的技术,它允许我们利用预训练模型的知识来解决新的问题。在本博客中,我们将通过一个有趣的项目——为前美国总统奥巴马的宠物狗Bo定制智能狗门——来探索迁移学习的实际应用。

迁移学习简介

迁移学习是一种机器学习技术,它涉及将从一个任务学到的模型应用到另一个不同但相关的任务上。当我们面对数据量不足或训练资源有限的情况时,迁移学习尤其有用。

目标

在本节中,您将学习到如何:

  • 准备预训练模型以进行迁移学习。
  • 使用自己的小型数据集对预训练模型进行迁移学习。
  • 优化模型以获得更好的性能。

个性化的狗门

我们将创建一个智能狗门,它只允许Bo进入,而将其他动物或物体排除在外。由于我们只有Bo的30张图片,从头开始训练一个模型很可能会导致过拟合。但是,我们可以从一个已经擅长检测狗的预训练模型开始,利用迁移学习解决这个问题。

下载预训练模型

我们将使用Keras库中的VGG16模型,这是一个在ImageNet数据集上预训练过的模型,非常适合作为迁移学习的基础。

from tensorflow import keras# 加载VGG16模型,不包括顶层(因为我们将添加自己的顶层)
base_model = keras.applications.VGG16(weights='imagenet',input_shape=(224, 224, 3),include_top=False
)

冻结基础模型

在添加新层之前,我们需要冻结基础模型的层,以保留通过ImageNet数据集训练获得的知识。

# 冻结基础模型的层
base_model.trainable = False

添加新层

我们将添加一个全局平均池化层和一个新的密集连接层,后者将作为我们的输出层,用于二分类任务(Bo或非Bo)。

from tensorflow.keras import Input, Model# 输入层
inputs = Input(shape=(224, 224, 3))# 利用预训练模型的输出
x = base_model(inputs, training=False)# 添加全局平均池化层
x = keras.layers.GlobalAveragePooling2D()(x)# 添加一个具有单个单元的输出层,用于二分类
outputs = keras.layers.Dense(1, activation='sigmoid')(x)# 创建带有输入和输出的模型
model = Model(inputs, outputs)

编译模型

由于这是一个二分类问题,我们将使用二元交叉熵作为损失函数,并使用二元精度作为评估指标。

model.compile(optimizer=keras.optimizers.RMSprop(lr=0.00001),  # 非常低的学习率loss='binary_crossentropy',metrics=['binary_accuracy']
)

数据增强

为了使我们的模型更具鲁棒性,我们将使用数据增强技术来人为地扩充训练集。

from tensorflow.keras.preprocessing.image import ImageDataGenerator# 创建数据增强对象
datagen = ImageDataGenerator(samplewise_center=True,rotation_range=10,zoom_range=0.1,width_shift_range=0.1,height_shift_range=0.1,horizontal_flip=True,vertical_flip=False  # Bo不太可能上下颠倒
)

加载数据

我们将从文件夹中直接加载图像数据,这是Keras flow_from_directory函数的用法。

# 加载训练数据集
train_it = datagen.flow_from_directory('data/presidential_doggy_door/train/',target_size=(224, 224),color_mode='rgb',class_mode='binary',batch_size=8
)# 加载验证数据集,不进行数据增强
valid_it = ImageDataGenerator(samplewise_center=True).flow_from_directory('data/presidential_doggy_door/valid/',target_size=(224, 224),color_mode='rgb',class_mode='binary',batch_size=8
)

训练模型

现在,我们可以训练模型,看看它的表现如何。

model.fit(train_it,steps_per_epoch=12,validation_data=valid_it,validation_steps=4,epochs=20
)

微调模型

一旦新层被训练,我们可以通过解冻基础模型并使用非常低的学习率重新训练模型来进一步改进模型,这个过程称为微调。

# 解冻基础模型
base_model.trainable = True# 重新编译模型,使用非常低的学习率
model.compile(optimizer=keras.optimizers.RMSprop(lr=0.00001),loss='binary_crossentropy',metrics=['binary_accuracy']
)# 继续训练模型
model.fit(train_it,steps_per_epoch=12,validation_data=valid_it,validation_steps=4,epochs=10
)

检查预测结果

让我们检查模型对一些图像的预测结果。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from tensorflow.keras.preprocessing import image as image_utils
from tensorflow.keras.applications.imagenet_utils import preprocess_inputdef show_image(image_path):image = mpimg.imread(image_path)plt.imshow(image)def make_predictions(image_path):show_image(image_path)image = image_utils.load_img(image_path, target_size=(224, 224))image = image_utils.img_to_array(image)image = image.reshape(1, 224, 224, 3)image = preprocess_input(image)preds = model.predict(image)return preds# 在几个图像上测试模型
make_predictions('data/presidential_doggy_door/valid/bo/bo_20.jpg')
make_predictions('data/presidential_doggy_door/valid/not_bo/121.jpg')

实现Bo的狗门

根据模型的预测结果,我们可以决定是否打开狗门。

def presidential_doggy_door(image_path):preds = make_predictions(image_path)if preds < 0:print("It's Bo! Let him in!")else:print("That's not Bo! Stay out!")# 测试Bo的狗门
presidential_doggy_door('data/presidential_doggy_door/valid/not_bo/131.jpg')
presidential_doggy_door('data/presidential_doggy_door/valid/bo/bo_29.jpg')

总结

通过本博客,您学习了如何使用迁移学习来构建一个高精度的模型,即使在数据集非常小的情况下。这种技术非常强大,可以在许多看似不可能的情况下取得成功。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/10759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 类加载器

AbstractBeanFactory --> ClassUtils.getDefaultClassLoader()->( Thread.currentThread().getContextClassLoader() or ClassLoader.getSystemClassLoader() ) --> AppClassLoader (默认情况下会拿到) Nullable public static ClassLoader getDefaultClassLoader() …

Fifteen Day 2024年5月11日

Dense adj.密集的 稠密的 浓密的 茂密的 Dense crowd. 密集的人群。 Crowd n.人群 群众 一群 v.聚集 挤满 Shanghai has a dense population. 上海的人口密度很大. Population n.人口 Pass through a dense jungle. 穿过一片茂密的丛林。 Through prep.穿越 越过 从头到…

代码+视频,R言语处理数据中的缺失值

在SCI论文中&#xff0c;我们不可避免和缺失数据打交道&#xff0c;特别是在回顾性研究&#xff0c;对于缺失的协变量&#xff08;就是混杂因素&#xff09;&#xff0c;我们可以使用插补补齐数据&#xff0c;但是对于结局变量和原因变量的缺失&#xff0c;我们不能这么做。部分…

mysql设置远程访问权限,允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

数据分析思维——数据埋点笔记,以电商为例

数据埋点 数据分析前提是有数据&#xff0c;数据从哪里来&#xff0c;要选择采集哪些数据都需要考虑。如某些app上的商品推荐&#xff0c;是基于哪些信息来预判的呢&#xff1f;因此作为数据分析师有必要系统的了解用户行为到用户数据的整个过程 何为数据埋点 每当用户在客户端…

【GlobalMapper精品教程】079:投影坐标系转地理坐标系(UTM转WGS1984/2000)

文章目录 一、矢量UTM转WGS1984/20001. UTM转WGS19842. UTM转CGCS2000二、栅格UTM转WGS1984/2000一、矢量UTM转WGS1984/2000 加载配套实验数据(data079.rar)中的矢量数据,如下所示: 查看源坐标系:双击图层的,图层投影选项卡,为UTM投影,Zone48N。 设置系统坐标系:点击…

C#【进阶】泛型

1、泛型 文章目录 1、泛型1、泛型是什么2、泛型分类3、泛型类和接口4、泛型方法5、泛型的作用思考 泛型方法判断类型 2、泛型约束1、什么是泛型2、各泛型约束3、约束的组合使用4、多个泛型有约束思考1 泛型实现单例模式思考2 ArrayList泛型实现增删查改 1、泛型是什么 泛型实现…

nowcoder——回文结构

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 我们来分析该题&#xff1a;我们首先要清楚什么是回文结构&#xff1f;其实就是对称结构。如果一个链表呈对称结构就说明该链表具有回文结构。 下面给上一些例子&#xff1a; 那我们怎么判断该链表是否属于回文结构呢&#xf…

电影评分和评论抓取

要从电影评分⽹站抓取电影的评分和⽤⼾评论&#xff0c;可以考虑使⽤BeautifulSoup和requests库解析⽹⻚内容。不过&#xff0c;实际操作中&#xff0c;针对特定⽹站的结构可能会有所不同&#xff0c;这⾥将给出⼀个基础的⽰例&#xff0c; 演⽰如何从⼀个假设的⽹站中抓取信息…

Python彻底解决TypeError的问题

今天看到一个问题&#xff1a; TypeError: int() argument must be a string, a bytes-like object or a number, not list 代码是这样的&#xff1a; id int(os.path.split(imagePath)[1].split(.)[0]) 其实这个提示已经非常明显了&#xff0c;百度翻译过来就是&#xff1a…

对Promise的理解

Promise的含义 Promise是ES6引入的JS中进行异步编程的新解决方案。 它是一个对象&#xff0c; 可以获取异步操作的消息&#xff0c; 它的出现大大改善了异步编程的困境&#xff0c; 避免了地狱回调&#xff0c;它比传统的解决方案回调函数和事件更合理和更强大。 Promise的实…

[BJDCTF2020]ZJCTF,不过如此 1

涉及&#xff1a;php的伪协议、preg_replace函数的漏洞和正则表达式的运用。 解题步骤 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream"))…

zookeeper安装集群模式

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 ZooKeeper是一个分…

梦幻西游全新变现,蓝海热门玩法,小白一部手机可操作,日入2000+

亲爱的朋友们&#xff0c;你们好&#xff01;今天我要给大家分享一个热门、可行的网络赚钱项目——梦幻西游全新变现&#xff0c;蓝海热门玩法&#xff0c;小白一部手机可操作&#xff0c;日入2000。 这个项目不需要花冤枉钱&#xff0c;也是我自己实操过的&#xff0c;非常可…

法语语式与时态总结,柯桥零基础学法语

常用语式 法语中的常用语式分为&#xff1a;直陈式、条件式、虚拟式、命令式、不定式与分词式。 直陈式&#xff08;lindicatif&#xff09;初学法语时首先就要学直陈式&#xff0c;也是最常用的语式&#xff0c;表示确实发生的动作。 条件式&#xff08;le conditionnel&am…

【C++】148 排序链表

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 对链表进行升序排序&#xff0c;常见的做法是使用归并排序&#xff08;Merge Sort&#xff09;算法。这种算法适用于链表的排序&#xff0c;并且具有稳定性和时间复杂度为 O(n log n) 的优点。 …

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

Redis——Redis的数据库结构、删除策略及淘汰策略

Redis是一个高性能的key-value存储系统&#xff0c;它支持多种数据结构&#xff0c;并提供了丰富的删除策略和淘汰策略。以下是关于Redis的数据库结构、删除策略及淘汰策略的详细介绍&#xff1a; Redis的数据库结构 Redis是一个key-value数据库&#xff0c;数据存储是以一个…

day06-07面向对象(高级)

面向对象(高级) 知识回顾: 1.面向对象基础 类的定义 对象的使用 private关键字 this关键字 封装 构造方法 JavaBean2.API 的使用 知识回顾 Scanner Random String Date1.继承 查看下述代码: 发现有什么问题&#xff1f; 你所抽取的代码没有了&#xff0c;怎么办&#xff1f…

【Qt-CMake】QT中cmak编译出现CMake Error: The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的&#xff0c;编写代码时发现无论怎样修改代码&#xff0c;运行后都没有任何变化&#xff0c;以为是qtbug&#xff0c;重构重启都没用&#xff0c;最后…